2015-09-01 56 views
0

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

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的环境中。所以当我需要cf1时,它应该能够在父环境中找到c。但事实证明,它只能找到全球c,而不是f2的环境中的c

回答

1

R具有词汇范围;未在函数中分配的变量将针对其静态环境进行解析。在你的情况下,f1会在你的全局环境中看到c的值,它是2.在f2中,c == 3,因为它作为掩码全局c的参数传递,但是当调用f1时,它仍然会看到c = = 2从它的封闭环境。您期望动态范围设定,其中c将采用其运行时环境的值(即在f2内)。 可以集C < - 3的功能外,F2之前,或者你可以做到这一点,以复制为“C”在F2传递到全球环境的局部值:

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/

+1

谢谢。这正是我正在寻找的。 – panc