在 [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
功能还是这种行为也表现在其他功能中?
它与S3泛型的S3方法有关 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泛型处于播放方法中时,调度首先决定将哪个方法传递给参数,然后提供参数 - 而不是排序 - 是什么经常会让你失望,特别是在混合时 formula
方法与其他非formula
方法。