考虑在全球环境中定义的以下函数:
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
的环境中工作?
答案 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}}