[英]Using the same argument names for a function defined inside another function
為什么
f <- function(a) {
g <- function(a=a) {
return(a + 2)
}
return(g())
}
f(3) # Error in a + 2: 'a' is missing
導致錯誤? 它與a = a參數有關,特別是與變量名相同的事實。 到底發生了什么?
以下是一些按預期工作的類似代碼:
f <- function(a) {
g <- function(a) {
return(a + 2)
}
return(g(a))
}
f(3) # 5
f <- function(a) {
g <- function(g_a=a) {
return(g_a + 2)
}
return(g())
}
f(3) # 5
g <- function(a) a + 2
f <- function(a) g(a)
f(3) # 5
問題是, 正如R語言定義中所解釋的那樣 :
函數的默認參數在函數的求值框架中計算。
在你的第一個代碼塊中,當你調用沒有任何參數的g()
,它會回退到它的默認值a
,即a
。 在“函數的框架”(即通過調用g()
創建的環境)中評估它,它會找到一個名稱與符號a
匹配的參數,其值為a
。 當它尋找該值a
,發現一個參數,其名稱符號匹配,並且它的值是a
。 什么時候...
正如您所看到的,您陷入了循環,這是錯誤消息試圖告訴您的:
Error in g() :
promise already under evaluation: recursive default argument reference or
earlier problems?
第二次嘗試,調用g(a)
按預期工作,因為你提供了一個參數,並且如R-lang的同一部分所述 :
在函數的評估框架中計算提供的函數參數。
在那里它找到一個符號a
,它被綁定到你傳遞給外部函數的形式參數a
任何值,並且一切都很好。
問題是a=a
部分。 參數不能是它自己的默認值。 這是一個循環參考。
此示例可能有助於闡明其工作原理:
x <- 1
f <- function(a = x) { x <- 2; a }
f()
## [1] 2
請注意, a
沒有默認值1; 它具有默認值2.它首先在函數本身中查找默認值。 以類似的方式, a=a
將導致a
為其自己的默認值,即圓形。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.