[R] automatically calling dev.off()

Duncan Murdoch murdoch.duncan at gmail.com
Tue Sep 1 17:00:20 CEST 2015


On 01/09/2015 10:13 AM, axionator wrote:
> Yes, the user could add something. Here, In about 90% of the time, he
> won't. So it would be nice to have a dev.off() as default (and some
> extra handling if more plot commands will follow).

That's a different mental model of how graphics should work, and it's
not compatible with standard R graphics.  However, it would be pretty
easy to get this to work with a grid graphics based systems (e.g.
ggplot2, lattice) since they don't draw anything until you print the
object:  you'd just need to override the print method.

Duncan Murdoch


> 
> On Tue, Sep 1, 2015 at 4:04 PM, Duncan Murdoch <murdoch.duncan at gmail.com
> <mailto:murdoch.duncan at gmail.com>> wrote:
> 
>     On 01/09/2015 7:34 AM, axionator wrote:
>     > Hi,
>     > is there a way to automatically call dev.off()?
>     > I use options(device="myfunc") to automatically open a device to print to.
>     > Afterwards, I would like to close it (so that the file is actually written).
>     > I tried to do it via addTaskCallback, but unfortunately, I have to use
>     > Rserve and (for any reason), the callback does not work (in the default R
>     > console on win7 it works, however).
>     >
>     > So, the following runs in the R console (but not via Rserve):
>     >
>     > mypng <- function(filename = "test.png", ...)
>     > {
>     >     times <- function(total = 2, str = "Task") {
>     >         ctr <- 0
>     >         function(expr, value, ok, visible) {
>     >             ctr <<- ctr + 1
>     >             keep.me <http://keep.me> <- (ctr < total)
>     >             if (ctr == total) {
>     >                 cat("ENDPRINT")
>     >                 dev.off()
>     >             }
>     >             keep.me <http://keep.me>
>     >         }
>     >     }
>     >     png(filename, ...)
>     >     n <- addTaskCallback(times(1))
>     > }
>     > options(device="mypng")
>     > plot(rnorm(333))
>     >
> 
>     It wouldn't make sense to call dev.off() after the plot() command,
>     because the user might be planning to add something to it.  You need to
>     tell R that you are done, and that's what dev.off() is for.
> 
>     You can call it automatically in a function by using
> 
>     on.exit(dev.off())
> 
>     and it should happen automatically at the end of an R session, but it
>     *shouldn't* happen after every plotting call.
> 
>     Duncan Murdoch
> 
>



More information about the R-help mailing list