【问题标题】:Anonymous passing of variables from current environment to subfunction calls从当前环境匿名传递变量到子函数调用
【发布时间】: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


    【解决方案1】:

    改用这个:

    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
    

    【讨论】:

    • 这是一个非常好的观点。不幸的是,您的解决方案也不起作用,我刚刚尝试过的任何变体也不起作用。
    • @WolfgangPößnecker 立即查看 :-)
    猜你喜欢
    • 2010-11-13
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2019-09-13
    • 2023-03-17
    • 2020-03-02
    • 2013-06-09
    相关资源
    最近更新 更多