如何使用父环境中指定的某些参数调用函数?

时间:2014-08-01 02:46:12

标签: r eval

考虑在全球环境中定义的以下函数:

test <- function(x,y) {
  x+y
}

使用eval(quote(test(1)),list(y=2))不起作用。

> eval(quote(test(1)),list(y=2))
Error in test(1) : object 'y' not found

这是因为该函数在y中找不到list(y=2)。有没有一种简单的方法可以修改我评估它的方式,以便test(1)在定义y的环境中工作?

3 个答案:

答案 0 :(得分:1)

我认为最安全的方法是在未提供的情况下从父框架定义默认值y

test<-function(x,y=get("y", envir=parent.frame(1))) {
    x+y
}

y<-3
test(1)
# [1] 4
test(1, 10)
# [1] 11

但实际上这听起来像是一个糟糕的主意。

答案 1 :(得分:0)

eval_with <- function(fn, ..., stuff = parent.frame()) {
  args <- list(...) 
  for (arg in setdiff(intersect(ls(stuff), names(formals(fn))), names(args)))
    args[[arg]] <- stuff[[arg]]
  do.call(fn, args)
}

实施例

local({
  print(eval_with(test, 1, stuff = list(y = 3))) # 4
  y <- 2
  print(eval_with(test, 1)) # 3
  print(eval_with(test, 1, 5 )) # 6
})

答案 2 :(得分:0)

也许是这样的?

在下面的test()中,如果参数列表中缺少y,则函数在全局环境中查找它,如果找到则计算x + y,否则,它接受给定的y > y <- 5 > test <- function(x, y) { if(missing(y)) y <- get("y", .GlobalEnv) x + y } > test(1) ## 1 + 5 # [1] 6 > test(1, 3) ## 1 + 3 # [1] 4 参数并在计算中使用它。

{{1}}