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

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 将不胜感激。

我们需要构建一个 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)