2015-09-01 101 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