0

函数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)”)会很麻烦,并且不会产生我想要的代码的整洁。因此,我需要将变量从父框架匿名传递给辅助函数。

4

1 回答 1

2

改用这个:

eval.here <- function(fun){
 fun <- get(fun)
 environment(fun) <- parent.frame()
 print(environment(fun))
 fun()
}

结果:

> testfun2(x = 2,y = 1:3)

<environment: 0x0000000013da47a8>
<environment: 0x0000000013da47a8>
$x
[1]  5  8 13

$xy
[1] 2 4 6
于 2013-09-18T19:08:53.203 回答