2011-11-16 25 views
3

可能重複:
Limiting variable scope使R返回一個錯誤,用於訪問全球

一個最簡單的錯誤,我潛入是有一個函數訪問的變量,在全球環境而不是當地的環境。在開發過程中,當我更改變量的名稱並忘記rm舊的 - 然後無法更新函數以使其訪問新的函數時,可能會發生這種情況。

有沒有辦法讓R從樹中的較高位置自動獲取變量時返回錯誤或警告?這樣看來,就現在R支持編譯後的代碼更容易....

這裏是想什麼,我返回一個錯誤/警告匆匆例如:

x <- 5 
f <- function(y) { 
    z <- y + x 
    z 
} 
f(3) #will return 8 
+1

請執行這些問題幫助:限制變量的作用域(http://stackoverflow.com/questions/3277556/limiting-variable-scope),[R力本地範圍(http://stackoverflow.com/問題/ 6216968/R-力本地範圍)? –

+0

@JoshuaUlrich第二個是我正在尋找的。爲了將所有好的答案統一在一個地方,投票結束。 –

+0

我已經通過在乾淨的R會話中測試我的函數來解決這個問題。 –

回答

2

我不認爲有一個簡單的方法(例如,在options()一個選項)。您的函數是否在R腳本文件中?你在建一個包嗎?

如果是這樣,我認爲最好的辦法是:

> f <- function(y) { 
+ z <- y + x 
+ z 
+ } 
> library(codetools) 
> checkUsage(f) 
<anonymous>: no visible binding for global variable ‘x’ (:2) 

但要注意的是,如果z定義,那麼這將找不到一個錯誤。您必須將您的f函數複製到新的R會話中,然後運行checkUsage。這看起來像一個痛苦,但它並沒有那麼糟糕,我相信你可以創建一些技巧來處理它。如果你的函數都在一個單獨的文件中,那麼這很容易。

+0

這似乎是正確的方式,但它都要求我每次都主動調用'checkUsage',並且在例如一次性匿名函數中並不真正起作用。 sapply調用.... –

+0

@ gsk3我不確定任何事情都可以修復一次性,但運行'checkUsage'是打包和腳本開發的好主意。 – Iterator

1

f()失敗,因爲有不是y的默認值。我想你的意思是f(1)

可能有更好的方法來做到這一點,但是您可以在開發過程中將函數定義包裝在local調用中。喜歡的東西:

x <- 5 
f <- local(function(y) { 
    z <- y + x 
    z 
}, baseenv()) 
f(1) 
# Error in f(1) : object 'x' not found 
+0

糟糕。 f(1)的確是我的意思。我喜歡本地包裝的想法。有沒有一種方法重載'function'功能,使這並不一定爲每個函數做,然後再未完成時發展「停止」(如同它曾經停止!)。 –

1

將函數放入包中始終是個好主意。這具有允許R CMD檢查的附加優點。 R執行的其中一個檢查依賴於變量(這在例如this question中被引用)。

當然,說實話,而實際開發,不斷改造和檢查,並重新安裝你的包是有點麻煩的,所以你可能會與其他的建議更好。