R несогласованность: почему add = T иногда работает, а иногда и не в функции plot()?
Почему R несовместимо с параметром add
в функции plot()
?
Он иногда работает, а иногда нет!
В этом примере он принимает параметр add=TRUE
без проблем:
plot(0:10, 0:10*3)
plot(identity, add=TRUE, xlim=c(0,10))
plot(function (x) { sin(x)*10 }, add=TRUE, xlim=c(0,10))
Но когда я выдаю
plot(c(2, 3, 4), c(20,10,15), add=TRUE, pch="A")
Это не работает!! В нем говорится, что "add" не является графическим параметром.
Пожалуйста, не пишите, что я должен использовать points()
. Я знаю, что могу это использовать.
Я хочу понять странное поведение R - почему это иногда срабатывает, а иногда и нет?
Ответы
Ответ 1
Это, по общему признанию, раздражающее и непоследовательное, но оно объяснимо.
edit: тот факт, что identity
является встроенным объектом (функция идентификации), ускользнул от меня (поэтому проблема на самом деле воспроизводима).
identity
- это объект класса - function
- который имеет метод plot
(plot.function
) с аргументом add
, тогда как метод plot
по умолчанию не имеют аргумент add
.
В общем, при попытке построить объект bar
вы должны попробовать class(bar)
; если он имеет класс foo
, попробуйте methods(class="foo")
, чтобы увидеть, что он имеет метод plot, или methods("plot")
, чтобы увидеть, что существует plot.foo
. Попробуйте ?plot.foo
увидеть справку или plot.foo
или getAnywhere(plot.foo)
, чтобы увидеть эту функцию.
Ответ 2
Это происходит потому, что, когда вы вызываете plot(0:10, 0:10*3)
или plot(c(2, 3, 4), c(20,10,15))
, вы косвенно вызываете plot.default()
, который, в свою очередь, вызывает plot.xy()
, тогда как другие два вызова, которые вы упомянули, работают plot.function()
. add
является аргументом для plot.function()
, но не для plot.xy()
.
Вы можете обойти эту несогласованность, установив par(new = TRUE)
, но тогда вам нужно убедиться, что вы не добавляете ярлыки новой оси или не перерисовываете оси. EDIT: Как указано в комментарии, вы должны убедиться, что диапазон совпадает с предыдущим графиком. например:.
plot(0:10, 0:10*3)
plot(identity, add=T, xlim=c(0,10))
plot(function (x) { sin(x)*10 }, add=T, xlim=c(0,10))
par(new = TRUE)
plot(c(2, 3, 4), c(20,10,15), pch="A",
axes = FALSE, ## don't redraw the axes
xlab = '', ylab = '', ## no fresh axis labels
xlim = c(0,10), ylim = c(0,30)) ## keep the same limits as before
Как упоминает Бен Болкер, methods('plot')
покажет вам, какие методы можно вызывать при запуске plot()
- разные методы имеют разные аргументы, которые перечисляются при вызове args(plot.foo)
или на странице справки ?plot.foo