2015-04-14 42 views
8

我已經看過R中的其他詞彙範圍問題,我無法找到答案。考慮以下代碼:什麼時候確定函數中的函數的詞法範圍?

f <- function(x) { 
    g <- function(y) { 
    y + z 
    } 
    z <- 4 
    x + g(x) 
} 
f(3) 

f(3)將返回10的回答我的問題是爲什麼呢?在代碼中定義了g()z尚未分配任何值。在什麼時候創建了g()的關閉點?它是否「向前看」功能體的其餘部分?是否在評估g(x)時創建?如果是這樣,爲什麼?

+4

這可能有助於人們解釋,如果你說了你期望的價值,而不是10 – joran

+0

注意,在新會話中,'f < - function(x){y}'將定義'f'沒有問題。在調用之前,R不關心'f'裏面的內容。 –

回答

10

當運行f時,第一件事是在f的本地環境中創建功能g。接下來,通過賦值創建變量z

最後,x被添加到g(x)的結果並返回。在g(x)被調用的時候,x = 3g存在於f的本地環境中。當在執行g(x)時遇到自由變量z時,R在下一個環境中查找呼叫環境,即f的本地環境。它發現z那裏進行,返回7.然後添加這x這是3

(因爲這個答案正在吸引更多的關注,我應該說什麼x「平等時補充說,我的語言有點鬆動「在各種可能不能準確反映R對辯論延遲評估的點上,x將會是等於3,一旦需要該值。)