Почему имеет значение порядок при использовании аргументов ключевого слова "данные" и "формула"?

В R почему возникает вопрос о том, что порядок ключевых слов data и formula имеет значение при построении графика? Я думал, что с указанными аргументами порядок не должен иметь значения...

Для примера, что я имею в виду, проверьте этот код:

library(MASS)
data(menarche)

# Correct formulation (apparently):
plot(formula=Menarche/Total ~ Age, data=menarche)

# In contrast, note how the following returns an error:
plot(data=menarche, formula=Menarche/Total ~ Age)  

Это просто причуда функции plot или это поведение проявляется и в других функциях?

Ответ 1

Это связано с методами S3 для S3 generic plot(). S3 отправляет методы на основе первого аргумента, однако точное функционирование является сложным, поскольку formula допускается как специальное исключение из обычных универсальных аргументов plot(), которые представляют собой x и y плюс ...:

> args(plot)
function (x, y, ...) 
NULL

Следовательно, в первом случае происходит то, что метод plot.formula() запускается, потому что первый предоставленный аргумент является формулой, и это соответствует аргументам plot.formula()

> args(graphics:::plot.formula)
function (formula, data = parent.frame(), ..., subset, ylab = varnames[response], 
    ask = dev.interactive()) 
NULL

например:

> debugonce(graphics:::plot.formula)
> plot(formula=Menarche/Total ~ Age, data=menarche)
debugging in: plot.formula(formula = Menarche/Total ~ Age, data = menarche)
debug: {
    m <- match.call(expand.dots = FALSE)
[...omitted...]

Напротив, когда вы вызываете plot(data=menarche, formula=Menarche/Total ~ Age), первый аргумент является фреймом данных, и поэтому вызывается метод graphics:::plot.data.frame:

> plot(data=menarche, formula=Menarche/Total ~ Age)
Error in is.data.frame(x) : argument "x" is missing, with no default
> traceback()
3: is.data.frame(x)
2: plot.data.frame(data = menarche, formula = Menarche/Total ~ Age)
1: plot(data = menarche, formula = Menarche/Total ~ Age)

но поскольку этот метод ожидает аргумент x, который вы не указали, вы получаете ошибку об отсутствии x.

Таким образом, в некотором смысле, порядок именованных аргументов не имеет и не должен иметь значения, но когда генерики S3 находятся в режиме play, сначала запускается диспетчеризация, чтобы решить, какой метод передать аргументы, а затем предоставленные аргументы - не упорядочивание - что вас часто поймает, особенно при смешении методов formula с другими методами non- formula.