[R] automatically calling dev.off()

Duncan Murdoch murdoch.duncan at gmail.com
Tue Sep 1 16:04:21 CEST 2015


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 <- (ctr < total)
>             if (ctr == total) {
>                 cat("ENDPRINT")
>                 dev.off()
>             }
>             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