Несоответствие 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")

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

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


person Tomas    schedule 22.07.2011    source источник
comment
Не могли бы вы сообщить нам класс вашего объекта identity?   -  person Andrie    schedule 22.07.2011
comment
PS. Обратите внимание, что использование T в качестве ярлыка для TRUE может навлечь на вас неприятности. Поскольку TRUE является зарезервированным словом, оно всегда будет TRUE. Но вы можете переопределить T <- FALSE или T <- 0, что может привести к неожиданному поведению.   -  person Andrie    schedule 22.07.2011
comment
identity() — стандартная функция из пакета base (см. ?identity). Спасибо, Андри, за комментарий к T и TRUE!   -  person Tomas    schedule 22.07.2011


Ответы (2)


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

редактировать: тот факт, что identity является встроенным объектом (функция идентификации), ускользнул от меня (так что проблема на самом деле воспроизводима).

identity — это объект класса function, который имеет метод plot (plot.function) с аргументом add, в то время как метод plot по умолчанию нет с аргументом add.

В общем, при попытке построить объект bar следует попробовать class(bar); если это класс foo, попробуйте methods(class="foo"), чтобы убедиться, что у него есть метод построения графика, или methods("plot"), чтобы увидеть, что plot.foo существует. Попробуйте ?plot.foo, чтобы увидеть справку, или plot.foo или getAnywhere(plot.foo), чтобы увидеть саму функцию.

person Ben Bolker    schedule 22.07.2011
comment
Спасибо Бен! Теперь понятно!! Да, ?plot.function перенаправляет меня на функцию curve(), и это объясняет это. Но методы (сюжет) не показывают ни функцию plot.function, ни кривую. Кроме того, методы (класс = функция) не дают никакого ответа о методе сюжета... - person Tomas; 22.07.2011
comment
Вы правы, они не работают. Я думаю, что они должны, хотя. Я отправил запрос в список разработчиков r. - person Ben Bolker; 25.07.2011
comment
@Tomas: это может быть для вас утешением, а может и нет, но теперь они работают в «разрабатываемой» версии R. Это было недавнее изменение ... - person Ben Bolker; 26.07.2011
comment
вы должны задать новый вопрос. Мой комментарий был не о add, а об использовании methods("plot") и methods(class="function") (которые действительно работают). - person Ben Bolker; 02.06.2015
comment
попался: plot( acf( x, plot=FALSE )) НЕ plot( acf(x) ) - person denis; 02.06.2015
comment
моя голова просто взорвалась!! надеюсь, я смогу понять это позже - person MaxYarmolinsky; 03.07.2019

Это связано с тем, что когда вы вызываете 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.

person nullglob    schedule 22.07.2011
comment
Спасибо nullglob за объяснение! Теперь ясно. Но ваш пример не очень чистый :-) Он не работает, потому что масштаб другой, поэтому буквы А нанесены на неправильные позиции :-) Это трюк низкого уровня, и я думаю, его не следует использовать, но спасибо - может быть, я использую его однажды :-) - person Tomas; 22.07.2011
comment
Вы правы - я забыл сохранить диапазон. Это то, о чем вам нужно позаботиться при использовании par(new = TRUE). Сейчас я исправил это в примере. - person nullglob; 22.07.2011
comment
Вызывается не plot.xy() (напрямую), а plot.default(), метод S3 по умолчанию для plot(). {plot.xy() - это не то, что обычно должен использовать пользователь, и это не метод plot(), хотя его название может указывать на это... в основном это имя из очень старой истории S, предшественник R} - person Martin Mächler; 25.07.2011