сброс par () в функции

при написании функции построения графика в R я бы не хотел изменять глобальную среду, поэтому я включаю что-то вроде

op <- par()
on.exit(par(op))

но это менее удовлетворительно, потому что он выдает предупреждающие сообщения (например, "In par(op) : graphical parameter "cin" cannot be set"), но что более важно, он не совместим с multi-группы участков. Например, если бы у меня была простая функция, такая как

pfun <- function(x) {
    op <- par()
    on.exit(par(op))

    par(bg = "gray21", col = "deeppink", col.axis = "deeppink")
    plot(x, 
        xaxt = "n",
        yaxt = "n",
        col = "deeppink", 
        cex = 2, 
        pch = 22, 
        bg = "deeppink",
        col.lab = "deeppink")
    axis(1, col = "deeppink")
    axis(2, col = "deeppink")
}

он отлично подходит для одного участка (кроме предупреждений), но несовместим с многопанельными участками, например,

par(mfrow = c(2, 2))
pfun(1:10)
pfun(10:1) # overwrites the first plot rather than plotting in the second panel

есть ли способ сбросить параметры графика при выходе, а также разрешить многопанельный график?

1 ответов


мы можем избежать вмешательства в многопанельные графики, только сохраняя / восстанавливая элементы par что мы меняем в функции. В этом случае это означает только хранение bg, col и axis.col. Важно избегать вмешательства в графические параметры (в частности,mfrow, mfcol и mfg), которые контролируют позиции мультипликатора.

pfun <- function(x) {
  op <- par('bg', 'col', 'col.axis')
  on.exit(par(op))

  par(bg = "gray21", col = "deeppink", col.axis = "deeppink")
  plot(x, 
    xaxt = "n",
    yaxt = "n",
    col = "deeppink", 
    cex = 2, 
    pch = 22, 
    bg = "deeppink",
    col.lab = "deeppink")
  axis(1, col = "deeppink")
  axis(2, col = "deeppink")
}

или, даже немного аккуратнее, использовать тот факт, что когда мы устанавливаем параметры с par это невидимо возвращает список старый значения параметров, которые мы изменили. Так что просто следующее будет работать хорошо:

  op <- par(bg = "gray21", col = "deeppink", col.axis = "deeppink")
  on.exit(par(op))