[Rd] Re: AW: par(par()) corrupts devices (PR#807)

Prof Brian Ripley Prof Brian Ripley <ripley@stats.ox.ac.uk>
Mon, 15 Jan 2001 12:57:30 +0000 (GMT)

> 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 

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