On 14/05/2010 6:19 PM, David Winsemius wrote:
On May 14, 2010, at 5:45 PM, Duncan Murdoch wrote:

On 14/05/2010 3:51 PM, David Winsemius wrote:
Some of the help page examples use the form:

opar <- par(<something>)
    .....plotting activities...
par(opar)

This seems to "work" well, yet I have read in some places
Please include commented, retrievalbe citations for "some places".

In the examples from help(par) I see:
op <- par(mfrow = c(2, 2),
# 2 x 2 pictures on one plot pty = "s")
  # square plotting region,
  # independent of device size
  ## At end of plotting, reset to previous settings:
par(op)
# Alternatively, op <- par(no.readonly = TRUE)
# the whole list of settable par's.
## do lots of plotting and par(.) calls, then reset: par(op)
## Note this is not in general good practice
Was it only with the use of the "no.read.only" parameter that one is supposed to avoid the form I illustrated. I had assumed it applied to both alternatives.

No, it applies to everything. The general rule of "etiquette" is that if you change the par() settings, you should restore them when you're done.

that it is not the preferred method to keep you parameters from getting corrupted. What is the preferred method?


The above, with the restore wrapped in on.exit(), as your sources should have said.

Perhaps it was implied in a manner to which I was not properly receptive. The only place I see on.exit() on the par help page is in the final example. I do not see a link to that function in the that help page, and I had read it but assumed it was related to "exit"-ing an R session. On visiting the on.exit help page for the first time in my life, I see that its primary use is with graphics device calls. So we are being advised to write that wrapper function each time we might be making a par-changing plot?

Code contained in "on.exit" expressions is executed when the current function exits. I would guess the first example didn't use this, because there's a fiction when running examples that they are run by the user at the command line: so on.exit() would never execute. (I don't know what happens if you put a naked on.exit() in example code; I would guess it would cause trouble, because it would interfere with the way R already handles the exit from running an example.) You need to read the comment, which says "At end of plotting, reset to previous settings:". The on.exit() wrapper is a way of ensuring that this happens when the code is in a function. No matter how the function exits (even if it exits due to an error), R will attempt to run that code and restore the settings.

So it is safe to run the example code in almost any context, because it sets a par() value, then restores it. But real code usually has something in between those two steps, and it may quit, or return from a function, or die due to an error. The advice is to write things in a way that ensures that no matter what goes wrong, if you've changed the parameters, then you will change them back.

Does that make sense?

Duncan Murdoch

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to