plot title r



R 2.11.1中的範圍和功能:出了什麼問題? (3)

這個問題來自一系列其他問題,都涉及基本相同的問題。 出於某種奇怪的原因,在另一個函數中使用一個函數有時會失敗,因為在第二個函數中找不到在第一個函數的本地環境中定義的變量。

偽代碼中的經典模式:

ff <- function(x){
    y <- some_value
    some_function(y)
}
ff(x)

eval(expr,envir,enclos)中的錯誤:未找到對象'y'

首先,我認為它與S4方法和在那裡的範圍有關,但是也發生在其他功能上。 我已經與R開發團隊進行了一些交流,但他們所做的只是將我引導到bug報告網站(這不是最吸引人的地方,我不得不說)。 我從來沒有得到任何反饋。

隨著問題的不斷出現,我懷疑是否有邏輯上的解釋。 在所有這些情況下,這是一個常見的錯誤,如果是的話,哪一個呢? 還是真的是一個錯誤?

其中一些問題:

PS:我知道R-devel名單,萬一你想知道...

https://src-bin.com


Answer #1

R既有詞彙也有動態範圍。 詞法作用域自動工作,但動態作用域必須手動實現,並且需要謹慎的簿記。 只有交互式用於數據分析的函數需要動態範圍,所以大多數作者(像我一樣)不知道如何正確地做到這一點。

另見: 標準的非標準評估規則


Answer #2

在R中無疑存在一些bug,但是人們所遇到的很多問題往往是在執行some_function錯誤,而不是R本身。 R有確定範圍的規則(參見http://cran.r-project.org/doc/manuals/R-intro.html#Scope ),它與函數參數的懶惰評估以及在其他作用域中eval參數的能力是極其相關的強大但也往往導致微妙的錯誤。


Answer #3

正如Dirk在他的回答中提到的那樣,您發布的代碼實際上並沒有問題。 在問題中發布的鏈接中,似乎有一個共同的主題: some_function包含以某種方式與環境some_function代碼。 這個混亂或者是明確的,使用new.env with或者使用data參數,或者使用data參數,

y <- eval(substitute(y), data)

這個故事的寓意是雙重的。 首先,盡量避免明確地操縱環境,除非你確定你知道自己在做什麼。 其次,如果一個函數有一個數據參數,那麼把你需要該函數的所有變量放在該數據框中。





scoping