2016-11-24 60 views
7

我正在閱讀Hadley Wickham的Advanced R,其中提供了一些非常好的練習。其中一人要求說明這個功能:瞭解功能輸入參數的評估

f1 <- function(x = {y <- 1; 2}, y = 0) { 
    x + y 
} 
f1() 

有人可以幫我理解爲什麼它返回3嗎?我知道有一種稱爲輸入參數的惰性評估,例如另一個練習要求說明這個功能

f2 <- function(x = z) { 
    z <- 100 
    x 
} 
f2() 

我正確地預測是100; x獲得值z,該值在函數內被求值,然後返回x。但我無法弄清楚f1()會發生什麼。

謝謝。

+2

真正的答案是,任何編寫這樣的代碼的人都應該被迫觀看24小時唐納德特朗普的視頻,或者直到他們的眼睛融化,無論哪個人先來。 –

+0

它不是任何代碼的一部分,但在練習:) – Celdor

回答

7

看這個從https://cran.r-project.org/doc/manuals/r-patched/R-lang.html#Evaluation

當一個函數被調用或調用一個新的評價幀創建 。在此框架中,根據參數匹配中給出的規則,形式參數與提供的參數匹配。 函數體中的語句在此環境框架中按順序評估 。 ... R有一種惰性評估函數參數的形式。直到需要時纔會評估參數。

,這從https://cran.r-project.org/doc/manuals/r-patched/R-lang.html#Arguments

爲參數的默認值可使用特殊形式 「名稱=表達式」來指定。在這種情況下,如果用戶在調用函數時未指定參數值 ,則表達式 將與相應的符號相關聯。當需要值 時,將在 函數的評估框中評估表達式。

總之,如果參數沒有用戶指定的值,則其默認值將在函數的評估框架中進行評估。所以y一開始沒有被評估。當在函數的評估框架中評估x的默認值時,y將被修改爲1,則x將被設置爲2.由於已經找到y,所以缺省參數沒有變化進行評估。如果您嘗試使用f1(y = 1)f1(y = 2),則結果仍爲3

+4

另外,我猜,值得一提的是'y + x'而不是'x + y'返回不同的值(在'f1'的身體) –

+0

很好解釋。 Ty :) – Celdor