R 为什么使用“订单”时订单很重要;“数据”;及;“公式”;关键词参数?

R 为什么使用“订单”时订单很重要;“数据”;及;“公式”;关键词参数?,r,plot,arguments,R,Plot,Arguments,在R中,为什么打印时数据和公式关键字的顺序很重要?我认为命名参数的顺序并不重要 有关我的意思的示例,请查看以下代码: 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

R中,为什么打印时
数据
公式
关键字的顺序很重要?我认为命名参数的顺序并不重要

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

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)  

这只是
绘图
函数的一个怪癖,还是在其他函数中也表现出这种行为

它与S3通用
plot()
的S3方法有关。S3基于第一个参数分派方法,但是确切的功能是复杂的,因为
公式
作为
plot()
的常规通用参数的特殊例外是允许的,这些参数是
x
y
加上

> args(plot)
function (x, y, ...) 
NULL
因此,在第一种情况下,会运行
plot.formula()
方法,因为提供的第一个参数是一个公式,这与
plot.formula()

例如:

> 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...]
但是,由于该方法需要一个参数
x
,而您没有提供该参数,因此会得到关于缺少
x
的错误


因此,从某种意义上说,命名参数的顺序并不重要,也不应该重要,但当S3泛型发挥作用时,方法调度首先开始决定将参数传递给哪个方法,然后是提供的参数(而不是顺序),这通常会让您感到困惑,特别是当将
公式方法与其他非
公式方法混合使用时。

图形:plot.default(data=menarche,formula=menarche/Total~Age)
vs
图形:plot.formula(data=menarche,formula=menarche/Total~Age)
@rawright;导致错误的是S3分派处理参数并分派到不同的方法,而不是排序。但是,第一个应该是
graphics:::plot.data.frame
,因为
traceback()
显示实际调用的是此方法。+1。我不知道你怎么能这么快就做到。事实上,这让我想知道我是如何浪费这么多时间寻找答案的。现在,请原谅,我必须处理所有这些…@JoshO'Brien它正在调用
plot()
->
plot.formula()
->
plot.default()
;这似乎将
HERRINGS
解释为将
Total
传递给
x
Age
传递给
y
,因此您得到了一个实际的绘图,然后
HERRINGS
作为一个公式保留在调用中,因此出现了多个警告。为了准确地理解正在发生的事情,我们必须研究
plot.formula
中的步骤,看看它是如何解释公式的,或者只是从
data=menarche
@GavinSimpson中提取数据,谢谢。在
plot.formula()
stats::model.frame.default
的调用中,一切都偏离了轨道,该调用没有任何公式指导,只返回一个包含列“Age”、“Total”和“Menarche”的模型框架。(有一个公式参数来指导它,它将产生一个两列的模型框架,其中列有“月经初潮/总量”和“年龄”)。稍后,
plot.formula()
提取模型框架
mf
的第一列,将其传递给
plot.default()
y
参数,并将模型框架的其余部分传递给
x
参数。(记录在案,在一条自删除的注释中,我问Gavin是否知道调用
plot.default()(HERRINGS=Menarche/Total~Age,data=Menarche)
给出了它的结果。)+1@JoshO'Brien考虑到变量分配给
x
y
的方式,我认为可能会发生这种情况,但我没有机会亲自检查,因为午餐时我一直在叫我:-)
> 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)
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)