为什么以下嵌套函数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
。所以当我需要c
in 的时候f1
,应该能够c
在父环境中找到。然而事实证明它只能找到 global 的环境c
,而不能找到c
inf2
的环境。
小智 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/
归档时间: |
|
查看次数: |
3179 次 |
最近记录: |