【问题标题】:Nested function in RR中的嵌套函数
【发布时间】:2015-09-01 19:48:02
【问题描述】:

为什么下面的嵌套函数 f2 不能按预期工作?

c = 2
f1 = function(a,b){
    (a+b)*c
}
f1(1,2) # 6

f2 = function(a,b,c){
    f1(a,b)
}
f2(1,2,c=3) # still 6, expect 9

更新

我发现以下修改有效:

f2 = function(a,b,c){
    c <<- c
    f1(a,b)
}
f2(1,2,c=3) # returns 9 as expected

但我对函数调用如何沿着环境路径搜索值感到困惑。如果我的问题只是由于 R 的懒惰评估,我只需要c &lt;- c。然后新的c 将在调用f2 的环境中。由于f1 嵌套在f2 中,所以它的环境嵌套在f2 的环境中。所以当我在f1中需要c时,应该可以在父环境中找到c。然而事实证明,在f2的环境中,它只能找到全局的c,而不是c

【问题讨论】:

    标签: r function nested


    【解决方案1】:

    R 有词法范围;未在函数中分配的变量将针对其静态环境进行解析。在您的情况下,f1 在您的全局环境中看到 c 的值,即 2。在 f2 中,c == 3 因为它作为掩盖全局 c 的参数传递,但是当 f1 被调用时,它仍然看到 c= =2 从它的封闭环境。您期望动态范围,其中 c 将取其运行时环境的值(即,在 f2 内)。 您可以在函数之外设置 c

     f2 = function(a,b,c){
        c <<- c     # local argument c copied to global c
        f1(a,b)
     }
    

    更多关于 R 中词法作用域的讨论:https://darrenjw.wordpress.com/2011/11/23/lexical-scope-and-function-closures-in-r/

    【讨论】:

    • 谢谢。这正是我正在寻找的。​​span>
    猜你喜欢
    • 2022-12-14
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2020-07-01
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多