【发布时间】:2013-09-23 16:16:09
【问题描述】:
下面定义的函数testfun1 执行我希望它执行的操作。 (关于这一切的原因,请参见代码示例下方的背景信息。)我想问你的问题是为什么我在testfun2 中尝试的方法不起作用。对我来说,两者似乎都在做同样的事情。如testfun2 中的打印所示,testfun2 中的辅助函数的评估发生在正确的环境中,但是来自主函数环境的变量神奇地传递给了testfun1 中的辅助函数,但不是testfun2。有谁知道为什么?
helpfun <- function(){
x <- x^2 + y^2
}
testfun1 <- function(x,y){
xy <- x*y
environment(helpfun) <- sys.frame(sys.nframe())
x <- eval(as.call(c(as.symbol("helpfun"))))
return(list(x=x,xy=xy))
}
testfun1(x = 2,y = 1:3)
## works as intended
eval.here <- function(fun){
environment(fun) <- parent.frame()
print(environment(fun))
eval(as.call(c(as.symbol(fun))))
}
testfun2 <- function(x,y){
print(sys.frame(sys.nframe()))
xy <- x*y
x <- eval.here("helpfun")
return(list(x=x,xy=xy))
}
testfun2(x = 2,y = 1:3)
## helpfun can't find variable 'x' despite having the same environment as in testfun1...
背景信息:我有一个大型 R 代码,我想在我的主函数中调用辅助函数。它们改变主函数环境的变量。这一切的目的主要是为了整理我的代码。 (主要功能代码目前超过 2000 行,对各种辅助函数的调用很多,它们本身有 40-150 行......)
请注意,我的辅助函数的参数数量非常多,因此传统的显式传递函数参数(“helpfun(arg1 = arg1, arg2 = arg2, ... , arg50 = arg50)”)会很麻烦,并且不会产生我想要的代码的整洁。因此,我需要将变量从父框架匿名传递给辅助函数。
【问题讨论】:
标签: r eval environment