为什么以下嵌套函数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 <- c
。然后,新c
将位于调用f2
的环境中。由于f1
嵌套在f2
中,因此其环境嵌套在f2
的环境中。因此,当我需要c
中的f1
时,它应该能够在父环境中找到c
。但是,事实证明它只能在c
的环境中找到全局c
,而不是f2
。
答案 0 :(得分:1)
R具有词汇范围;未在函数中分配的变量将针对其静态环境进行解析。在你的情况下,f1在你的全局环境中看到c的值,即2.在f2中,c == 3因为它作为一个参数传递,它掩盖了全局c,但是当调用f1时,它仍然看到c =距其封闭环境= 2。您期望动态范围,其中c将采用其运行时环境的值(即,在f2内)。 您可以在f2之前在函数外部设置c&lt; - 3,或者您可以执行此操作以复制传递的本地值为&#39; c&#39;在f2到全球环境:
homework1
更多关于R:https://darrenjw.wordpress.com/2011/11/23/lexical-scope-and-function-closures-in-r/
中词汇范围的讨论