AW: par(par()) corrupts devices (PR#807)
From: "Dr. Jens Oehlschlägel" <jens.oehlschlaegel@bbdo-interone.de> Date: Mon, 15 Jan 2001 13:58:00 +0100 Dear Prof. Ripley, I do not insist that features are bugs, so I stop sending this to r-bugs and cc r-devel instead
I am replying to this from the archive: I did not actually receive a
copy. But it is right to sent bug reports ONLY to r-bugs, isn't it? I'am actually using a old version of outlook, and some mails from r-help appear as attachments, may it's an outlook problem.
My guess is that it was an R-bugs mail distribution problem at KU. Certainly not your end.
This is a feature!
(I was being somewhat ironic. It was a design error.)
You set par(pin=), and that takes precedence over par(pty=). Same with par(plt=). To unjam it, you need e.g. par(mai=old.par$mai) I think that par(pty=) should revert to a default plot spec, and will change this. But, the problem with restoring lists like that is that it depends on exactly the order of the params as they interact. It is *not* a good idea. And no.readonly=T does not help as plt and pin are not readonly. If the user has resized the device before restoration, it's pretty chancy what it gets set to.
Thank you for explaining the way it happens. I must admit, that again I am baffled things do not work as I expect. WHAT IS THE RECOMMENDED WAY TO RESTORE GRAPHICAL PARAMETERS TO EXACTLY WHAT THEY WERE?
Should work in 1.2.1 if the size is unchanged.
I admit, I expected par(par()) not to change anything (I remember vague that it worked with the prototype), but in this case it is not (only) a problem of restoring a list. Just setting par(pin) and "re-setting" it DOES CHANGE the device: subsequent par(pty="s") are ignored.
No longer in 1.2.1.
I am shure I am not the only one who expected the on.exit() stuff within
the following function to leave the graphical parameters UNCHANGED, but it
doesn't.
somefunc <- function(){
oldpin <- par(pin=par("pin"))
on.exit(par(oldpin))
plot(1,1)
}
windows(5,3)
par(pty="s")
plot(1,1)
# square
par(pty="m")
plot(1,1)
# which settings do we have before
par1 <- par()
somefunc()
# which settings do we have now
par2 <- par()
# do they differ: yes on plt
all.equal(par1, par2)
# reset plt
par(plt=par1$plt)
# which settings do we have now
par2 <- par()
# do they differ: no
all.equal(par1, par2)
par(pty="s")
plot(1,1)
#still not square
#i.e we have hidden parameters
#because all par() are restored to values where par(pty="s") did work
if the user has resized the device before restoration, it's pretty chancy
what it gets set to. I find it frightening to discover that we obvisously have hidden device parameters, and more frigthening that they may be modified by resizing. Sorry that I can't provide code fix, but this is far to deep within the heart of R.
That's not quite right. R has several pars doing the same thing. They will give different answers after re-sizing, and the last one used wins out. S does not have this problem because (essentially) it does not resize. Ideally there would be a way to save just one of the conflicting options.
Brian D. Ripley, ripley@stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._