在 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
函数的一个怪癖,还是在其他函数中也表现出这种行为?
答案 0 :(得分:13)
它与S3泛型plot()
的S3方法有关。 S3根据第一个参数调度方法,但确切的功能很复杂,因为formula
被允许作为plot()
的常用通用参数的特殊例外,x
和{{1} }加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
的错误。
所以从某种意义上说,命名参数的排序并不重要,但是当S3泛型处于播放方法时,调度会首先启动,以决定将参数传递给哪个方法然后提供的参数 - 而不是排序 - 会经常引起你的注意,特别是在将x
方法与其他非formula
方法混合使用时。