簡體   English   中英

為另一個函數中定義的函數使用相同的參數名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM