Ответ 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
.