From murdoch@dunc@n @end|ng |rom gm@||@com  Tue Oct  3 02:25:57 2023
From: murdoch@dunc@n @end|ng |rom gm@||@com (Duncan Murdoch)
Date: Mon, 2 Oct 2023 20:25:57 -0400
Subject: [Rd] Problems caused by dev.off() behaviour
In-Reply-To: <CAMigB8FWHaLWB1SvHi3Bw9dW9jkdHv1C-M3x4NSX0NnqjggyCg@mail.gmail.com>
References: <affab490-cd9f-46e7-ab9f-37a4b13d2557@gmail.com>
 <CAMigB8FWHaLWB1SvHi3Bw9dW9jkdHv1C-M3x4NSX0NnqjggyCg@mail.gmail.com>
Message-ID: <d39b6d56-127d-4c5c-b7b7-e436372fa1ce@gmail.com>

Thanks!  However, isn't length(dev.list()) == 0 when there are no 
devices?  That's what I'm seeing on MacOS.

Duncan Murdoch

On 02/10/2023 4:21 p.m., Trevor Davis wrote:
>  > Use it just like dev.off(), but it *will* restore the previous device.
> 
> I'm observing that if there were no previously open graphics devices 
> then your `safe.dev.off()` opens up a new graphics device which may be 
> an undesired side effect (because "surprisingly" `dev.set()` on the null 
> graphics device opens up a new graphics device).? To avoid that you 
> could check if `dev.list()` is greater than length 1L:
> 
>  ?? safe.dev.off ?<- function(which = dev.cur(), prev = dev.prev()) {
>  ? ? ?force(prev)
>  ? ? ?dev.off(which)
>  ? ? ?if (length(dev.list()) > 1L) {
>  ? ? ? ?dev.set(prev)
>  ? ? ?}
>  ? ?}
> 
> Trevor
> 
> On Mon, Oct 2, 2023 at 11:54?AM Duncan Murdoch <murdoch.duncan at gmail.com 
> <mailto:murdoch.duncan at gmail.com>> wrote:
> 
>     I found some weird behaviour and reported it as
>     https://bugs.r-project.org/show_bug.cgi?id=18604
>     <https://bugs.r-project.org/show_bug.cgi?id=18604> and
>     https://github.com/yihui/knitr/issues/2297
>     <https://github.com/yihui/knitr/issues/2297>, but it turns out it
>     was user
>     error.
> 
>     The dev.off() function was behaving as documented, but it behaves in an
>     unexpected (by me) way, and that caused the "bugs".
> 
>     The issue is that
> 
>      ? ? dev.off()
> 
>     doesn't always result in the previous graphics device being made
>     current.? If there are two or more other open graphics devices, it
>     won't
>     choose the previous one, it will choose the next one.
> 
>     I'm letting people know because this might affect other people too.? If
>     you use dev.off(), don't assume it restores the previous device!
> 
>     Here's my little workaround alternative:
> 
>      ? ?safe.dev.off? <- function(which = dev.cur(), prev = dev.prev()) {
>      ? ? ?force(prev)
>      ? ? ?dev.off(which)
>      ? ? ?dev.set(prev)
>      ? ?}
> 
>     Use it just like dev.off(), but it *will* restore the previous device.
> 
>     Duncan Murdoch
> 
>     ______________________________________________
>     R-devel at r-project.org <mailto:R-devel at r-project.org> mailing list
>     https://stat.ethz.ch/mailman/listinfo/r-devel
>     <https://stat.ethz.ch/mailman/listinfo/r-devel>
>



[Rd] Problems caused by dev.off() behaviour
Duncan Murdoch