簡體   English   中英

R 2.11.1中的范圍和功能:出了什么問題?

[英]Scoping and functions in R 2.11.1 : What's going wrong?

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

偽代碼中的經典模式:

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

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

首先我認為它與S4方法和那里的范圍有關,但它也與其他函數一起發生。 我和R開發團隊進行了一些互動,但是他們所做的只是讓我直接進入錯誤報告站點(我不得不說,這不是最吸引人的站點)。 我從來沒有得到任何反饋。

隨着問題不斷出現,我想知道是否有一個邏輯解釋。 在所有這些情況下是否是一個常見的錯誤,如果是這樣,哪一個? 或者它真的是一個錯誤?

其中一些問題:

PS:我知道R-devel列表,萬一你想知道......

R具有詞匯和動態范圍。 詞法范圍自動運行,但動態范圍必須手動實現,並且需要仔細記賬。 只有交互式地用於數據分析的函數才需要動態范圍,所以大多數作者(像我一樣!)都沒有學會如何正確地完成它。

另請參見: 標准的非標准評估規則

R中無疑存在缺陷,但人們所遇到的很多問題往往是some_function的實現錯誤,而不是R本身。 R具有范圍規則(參見http://cran.r-project.org/doc/manuals/R-intro.html#Scope ),當與函數參數的惰性求值結合並且在其他范圍內eval參數的能力非常高時功能強大,但也經常導致微妙的錯誤。

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

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

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

那么你發布的內容沒有問題

/tmp$ cat joris.r 
#!/usr/bin/r -t

some_function <- function(y) y^2

ff <- function(x){
    y <- 4
    some_function(y)  # so we expect 16
}
print(ff(3))          # 3 is ignored
$ ./joris.r 
[1] 16
/tmp$

你可以重申並發布實際的錯誤或錯誤嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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