函数testfun1
,定义如下,做我想做的事。(关于这一切的原因,请参阅代码示例下方的背景信息。)我想问你的问题是为什么我尝试的方法testfun2
不起作用。对我来说,两者似乎都在做同样的事情。如 in 中的打印所示,testfun2
内部辅助函数的评估testfun2
发生在正确的环境中,但来自主函数环境的变量神奇地传递给 in 中的辅助函数testfun1
,而不是 in 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)
”)会很麻烦,并且不会产生我想要的代码的整洁。因此,我需要将变量从父框架匿名传递给辅助函数。