stats::lm
函数,并将公式和数据框作为参数。我们可以使用可变参数来提供要传递给stats::lm
的其他参数:outer_function <- function(formula, data, ...) {
z <- stats::lm(formula = formula, data = data, ...)
return(z)
}
现在假设我们想要使用此函数并提供额外的参数 (weights
),该参数将被传递给 stats::lm
。
data <- data.frame(replicate(5, rnorm(100)))
weights <- replicate(100, 1)
formula <- X1 ~ X2 + X3
outer_function(formula = formula, data = data, weights = weights)
在 stats::lm
中,这将产生以下错误:
Error in eval(extras, data, env) :
..1 used in an incorrect context, no ... to look in
调试stats::lm
的调用时,我发现参数weights
被正确传递到stats::lm
函数中,但稍后在该函数中用于评估的match.call()
却出了问题。
stats::lm(formula = formula, data = data, weights = ..1)
这使得weights
被赋值为...
列表的第一个元素,该元素为空。
有谁可以详细说明为什么这种方法会失败?特别是,如果weights
是一个标量(比如5),则不会出现问题,match.call()
应该是
stats::lm(formula = formula, data = data, weights = 5)
目前,我正在使用以下解决方案来编写我的函数:
outer_function <- function(formula, data, ...) {
args <- list(formula = formula, data = data, ...)
z <- do.call(stats::lm, args)
return(z)
}
这个方法可以奏效,但我仍然想知道,在...
参数是向量或列表时,是否有不使用do.call
的方法。
do.call
有什么特别的原因吗? - Mikael Jagan