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 at 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 at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
>
[[alternative HTML version deleted]]