Непоследовательность R: почему add = T иногда работает, а иногда нет в функции plot ()? - PullRequest
45 голосов
/ 22 июля 2011

Почему 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")

Это не работает !! Он говорит, что «добавить» не является графическим параметром.

Пожалуйста, не пишите, что я должен использовать points() вместо этого. Я знаю, что могу использовать это. Я хочу понять странное поведение R - почему иногда оно работает, а иногда нет?

Ответы [ 2 ]

36 голосов
/ 22 июля 2011

Это по общему признанию раздражает и противоречив, но это объяснимо.

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), чтобы увидеть саму функцию.

27 голосов
/ 22 июля 2011

Это потому, что когда вы звоните 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), но тогда вам нужно убедиться, что вы не добавляете новые метки осей и не перерисовываете оси. РЕДАКТИРОВАТЬ: Как указано в комментарии, вы должны убедиться, что диапазон совпадает с предыдущим графиком. e.g.:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...