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). On Tue, Sep 1, 2015 at 4:04 PM, Duncan Murdoch <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 <- (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 > >[[alternative HTML version deleted]]
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 > >
Yes, it's a different model, but maybe my main problem is that Rserve does not handle addTaskCallback as in the console (and thus no dev.off() is called). On Tue, Sep 1, 2015 at 5:00 PM, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:> 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 > > > > > >[[alternative HTML version deleted]]