这个问题是对 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(object, ...)
anova
电话UseMethod
, 应该*调用 anova.lm
这应该叫 anova.lmlist
,其第一行是 objects <- list(object, ...)
,但是 object
不存在于该公式中。我唯一能猜到的就是
do.call
可能不只是填写省略号,而是填写所有没有默认值的参数,并为省略号留下任何额外的内容?如果是这样,记录在哪里,因为它对我来说绝对是新的!* 这本身就是一个线索——如何
UseMethod
知道打电话anova.lm
如果第一个参数未指定?没有 anova.list
方法或 anova.default
或类似...
最佳答案
在常规函数调用中 ...
按位置、部分匹配和完全匹配捕获参数:
f <- function(...) g(...)
g <- function(x, y, zabc) c(x = x, y = y, zabc = zabc)
f(1, 2, 3)
# x y zabc
# 1 2 3
f(z = 3, y = 2, 1)
# x y zabc
# 1 2 3
do.call
除了不是直接将参数提供给函数之外,它们的行为方式完全相同,它们存储在列表中和 do.call
负责将它们传递给函数:do.call(f, list(1, 2, 3))
# x y zabc
# 1 2 3
do.call(f, list(z = 3, y = 2, 1))
# x y zabc
# 1 2 3
关于r - do.call() 在没有默认参数的情况下的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18108419/