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

时间:2017-06-18 15:13:55

标签: r function regression linear-regression lm

我正在编写一个调用另一个函数的函数(例如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(...),并手动处理参数,但这在实际情况下是不切实际的。

我可以看到这是相当基本的,但我无法找到解决方案。对特定问题的任何建议以及对环境的良好概念性解释的链接都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

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