r - 编写一个包装函数,通过省略号 (..) 成功获取加法参数(如子集)



我正在编写一个调用另一个函数的函数(例如lm),我想通过其他 使用省略号 (...) 对它的参数。但是,要使用的数据不是 在全球环境中,但在列表中。一个最小的例子:

L <-  list(data = chickwts, other = 1:5)
wrapper <-  function(list, formula = NULL, ...){
if (missing(formula)) formula <-  formula(weight~feed)
lm(formula, data = list$data, ...)
}
wrapper(L, subset = feed != "casein") #fails

我可以使用attach使其工作,但我相信通过指定评估框架有更有效的方法......?

wrapper2 <-  function(list, formula = NULL, ...){
if (missing(formula)) formula <-  formula(weight~feed)
attach(list$data)
m <- lm(formula, ...)
detach(list$data)
return(m)
}
wrapper2(L, subset = feed != "casein") #works

我之前使用过的另一个解决方案是使用list(...),并手动处理参数,但这在实际情况中是不切实际的。

我可以看到这是相当基本的,但我找不到解决方案。如能就具体问题提出任何建议,并提供对一般环境的良好概念解释的链接,将不胜感激。

我们需要构造一个calleval它。

wrapper <-  function(list, formula = NULL, ...){
if (missing(formula)) formula <- weight ~ feed
cl <- match.call()
cl$list <- NULL
cl$formula <- formula
cl$data <- quote(list$data)
cl[[1]] <- quote(stats::lm)
eval(cl)
}

可重现的示例:

L <- list(data = trees, other = 1:5)
wrapper(L, Height ~ Girth, subset = Volume > 20)

最新更新