R中的嵌套函数

时间:2015-09-01 19:48:03

标签: r function nested

为什么以下嵌套函数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

1 个答案:

答案 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/

中词汇范围的讨论