【发布时间】:2013-08-09 03:02:25
【问题描述】:
这个问题是previous answer 的后续问题,它提出了一个难题。
上一个答案的可重现示例:
Models <- list( lm(runif(10)~rnorm(10)),lm(runif(10)~rnorm(10)),lm(runif(10)~rnorm(10)) )
lm1 <- lm(runif(10)~rnorm(10))
library(functional)
# This works
do.call( Curry(anova, object=lm1), Models )
# But so does this
do.call( anova, Models )
问题是为什么do.call(anova, Models) 工作正常,正如@Roland 指出的那样?
anova 的签名是anova(object, ...)
anova 调用UseMethod,它应该* 调用anova.lm,它应该调用anova.lmlist,其第一行是objects <- list(object, ...),但object 在该公式中不存在。
我唯一可以推测的是do.call 可能不只是填写省略号,而是填写所有没有默认值的参数,并为省略号留下任何额外信息?如果是这样,那记录在哪里,因为它对我来说绝对是新的!
* 这本身就是一个线索——如果第一个参数未指定,UseMethod 如何知道调用anova.lm?没有anova.list 方法或anova.default 或类似方法...
【问题讨论】:
-
不是和
do.call(plot, list(1:2, 1:2, col="red"))一样的情况吗?它似乎遵循位置匹配、命名参数和...的标准行为。 -
我很困惑,
do.call(anova, Models)与anova(Models[[1]], Models[[2]], Models[[3]])相同有什么令人困惑的? -
因为
do.call总是被说成是...的解决方案,所以我猜从来没有提到它也会根据位置匹配规则进行填充。但这让我很惊讶。 -
@SimonO101 似乎你错过了“*”的点,再次回滚......
-
do.call只是从do.call(f, list(...))到f(...)进行基本的词法替换 - 您始终可以将命名和未命名参数传递给...