我正在编写一个调用另一个函数的函数(例如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(...)
,并手动处理参数,但这在实际情况下是不切实际的。
我可以看到这是相当基本的,但我无法找到解决方案。对特定问题的任何建议以及对环境的良好概念性解释的链接都将受到赞赏。
答案 0 :(得分:0)
我们需要构建一个call
和eval
。
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)