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