r - do.call() 在没有默认参数的情况下的行为

标签 r arguments do.call

这个问题是对 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/

相关文章:

r - 使数据框更宽,包含月份(列)和周期(行)

ios - 如何在@selector 中传递参数?

javascript - 为 JavaScript 函数设置默认参数值

java - 通过在 JComboBox 中进行选择将枚举值传递给函数

R data.table 连接 : SQL "select *" alike syntax in joined tables?

r - 保存 foreach dopar 循环的多个输出

从 ggplot2 map 中删除南极洲

r - 在 R 中使用 lapply 或 with 的用户定义函数中的非标准评估

r - 将命名的模型列表传递给 anova.merMod

function - R:将字符串指定为调用另一个函数的函数的参数