使用“数据”和“公式”关键字参数时,为什么订单很重要?

时间:2014-07-22 17:24:35

标签: r plot arguments

R 中,为什么在绘制时dataformula关键字的顺序很重要?我认为用命名参数命令不是应该重要...

有关我的意思的示例,请查看以下代码:

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 个答案:

答案 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方法混合使用时。