[R] Unexpected behavior in par()

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Sat Apr 2 23:02:31 CEST 2022


Hello,

Thanks, that makes sense. So don't use par(no.readonly = TRUE) unless 
that's the desired behavior.

Rui Barradas

Às 20:00 de 02/04/2022, Bill Dunlap escreveu:
> par("mfrow") works by updating par("fig") before each plot.  I think 
> that when you reset all the par values after each plot you reset 
> par("fig") to the value it had before you made the last plot.
> 
> -Bill
> 
> On Sat, Apr 2, 2022 at 10:45 AM Rui Barradas <ruipbarradas using sapo.pt 
> <mailto:ruipbarradas using sapo.pt>> wrote:
> 
>     Hello,
> 
>     I have a function using base graphics that changes some graphics
>     parameters, then plots what it has to plot, then on exit puts the
>     graphics parameters back as they were.
>     The problem is that if outside the function the graphics parameters are
>     also changed, for instance mfrow, those chages are not respected by the
>     function. This seems to come from the way the graphics pars are saved.
> 
>     After par(mfrow = c(2, 1))
> 
>     - if I call par(no.readonly = TRUE) then the second call to the
>     function
>     plots in the 1st row, it overplots what was plotted before.
>     - if I save the pars when they are changed, all is well.
> 
>     Here is a reproducible example.
> 
> 
>     f <- function(x, ...) {
>         old_par <- par(no.readonly = TRUE)    # this is the problem
>         par(mar = c(4.1, 3.1, 3.1, 1.1))      # or maybe here
>         on.exit(par(old_par))
>         barplot(x, ...)
>     }
> 
>     g <- function(x, ...) {
>         old_par <- par(mar = c(4.1, 3.1, 3.1, 1.1))   # this is the solution
>         on.exit(par(old_par))
>         barplot(x, ...)
>     }
> 
>     set.seed(2022)
>     b1 <- table(sample(4, 100, TRUE))
>     b2 <- table(sample(10, 100, TRUE))
> 
>     # 1st function, unexpected behavior
>     old_par <- par(mfrow = c(2, 1))
>     f(b1, main = "1st plot")
>     f(b2, main = "2nd plot")
>     par(old_par)
> 
>     # 2nd function, all is well
>     old_par <- par(mfrow = c(2, 1))
>     g(b1, main = "1st plot")
>     g(b2, main = "2nd plot")
>     par(old_par)
> 
> 
>     If I print(old_par) in any of the functions the result is the right
>     mfrow setting, so I would expect the 2nd call to f() to plot in the 2nd
>     row. But it doesn't.
>     Function f() calls par() twice but it only changes a parameter
>     unrelated
>     to the parameter set outside the function.
> 
>     I'm obviously making a mistake but I don't know what. Is this expected
>     (or a par() bug)?
> 
> 
>     Thaks in advance,
> 
>     Rui Barradas
> 
>     ______________________________________________
>     R-help using r-project.org <mailto:R-help using r-project.org> mailing list --
>     To UNSUBSCRIBE and more, see
>     https://stat.ethz.ch/mailman/listinfo/r-help
>     <https://stat.ethz.ch/mailman/listinfo/r-help>
>     PLEASE do read the posting guide
>     http://www.R-project.org/posting-guide.html
>     <http://www.R-project.org/posting-guide.html>
>     and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list