R 中的嵌套函数

pan*_*anc 1 nested r function

为什么以下嵌套函数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
Run Code Online (Sandbox Code Playgroud)

更新

我发现以下修改有效:

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

但我对函数调用如何沿着环境路径搜索值感到困惑。如果我的问题只是由于 R 的惰性求值,我只需要c <- c. 然后新的c将在被调用的环境中f2。由于f1是 嵌套在 中f2,因此它的环境也嵌套在 的环境中f2。所以当我需要cin 的时候f1,应该能够c在父环境中找到。然而事实证明它只能找到 global 的环境c,而不能找到cinf2的环境。

小智 5

R 有词法范围;函数中未分配的变量将根据其静态环境进行解析。在您的情况下,f1 在全局环境中看到 c 的值,即 2。在 f2 中,c == 3 因为它作为屏蔽全局 c 的参数传递,但当调用 f1 时,它仍然看到 c= =2 来自其封闭环境。您期望动态作用域,其中 c 将采用其运行时环境的值(即在 f2 内)。您可以在函数外部、f2 之前设置 c <- 3,或者可以执行此操作以将 f2 中作为“c”传递的本地值复制到全局环境:

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

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