编写一个包装函数以通过省略号 (...) 成功获取附加参数(如子集)
Write a wrapper function to successfully take addition arguments (like subset) via ellipsis (...)
我正在编写一个调用另一个函数的函数(例如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(...)
,并手动处理参数,但在实际情况下并不实用。
我可以看出这是相当基本的,但我找不到解决方案。对特定问题的任何建议以及对一般环境的良好概念解释的 link 将不胜感激。
我们需要构建一个 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)
我正在编写一个调用另一个函数的函数(例如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(...)
,并手动处理参数,但在实际情况下并不实用。
我可以看出这是相当基本的,但我找不到解决方案。对特定问题的任何建议以及对一般环境的良好概念解释的 link 将不胜感激。
我们需要构建一个 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)