一個最簡單的錯誤,我潛入是有一個函數訪問的變量,在全球環境而不是當地的環境。在開發過程中,當我更改變量的名稱並忘記rm
舊的 - 然後無法更新函數以使其訪問新的函數時,可能會發生這種情況。
有沒有辦法讓R從樹中的較高位置自動獲取變量時返回錯誤或警告?這樣看來,就現在R支持編譯後的代碼更容易....
這裏是想什麼,我返回一個錯誤/警告匆匆例如:
x <- 5
f <- function(y) {
z <- y + x
z
}
f(3) #will return 8
一個最簡單的錯誤,我潛入是有一個函數訪問的變量,在全球環境而不是當地的環境。在開發過程中,當我更改變量的名稱並忘記rm
舊的 - 然後無法更新函數以使其訪問新的函數時,可能會發生這種情況。
有沒有辦法讓R從樹中的較高位置自動獲取變量時返回錯誤或警告?這樣看來,就現在R支持編譯後的代碼更容易....
這裏是想什麼,我返回一個錯誤/警告匆匆例如:
x <- 5
f <- function(y) {
z <- y + x
z
}
f(3) #will return 8
我不認爲有一個簡單的方法(例如,在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
。這看起來像一個痛苦,但它並沒有那麼糟糕,我相信你可以創建一些技巧來處理它。如果你的函數都在一個單獨的文件中,那麼這很容易。
這似乎是正確的方式,但它都要求我每次都主動調用'checkUsage',並且在例如一次性匿名函數中並不真正起作用。 sapply調用.... –
@ gsk3我不確定任何事情都可以修復一次性,但運行'checkUsage'是打包和腳本開發的好主意。 – Iterator
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
糟糕。 f(1)的確是我的意思。我喜歡本地包裝的想法。有沒有一種方法重載'function'功能,使這並不一定爲每個函數做,然後再未完成時發展「停止」(如同它曾經停止!)。 –
將函數放入包中始終是個好主意。這具有允許R CMD檢查的附加優點。 R執行的其中一個檢查依賴於變量(這在例如this question中被引用)。
當然,說實話,而實際開發,不斷改造和檢查,並重新安裝你的包是有點麻煩的,所以你可能會與其他的建議更好。
請執行這些問題幫助:限制變量的作用域(http://stackoverflow.com/questions/3277556/limiting-variable-scope),[R力本地範圍(http://stackoverflow.com/問題/ 6216968/R-力本地範圍)? –
@JoshuaUlrich第二個是我正在尋找的。爲了將所有好的答案統一在一個地方,投票結束。 –
我已經通過在乾淨的R會話中測試我的函數來解決這個問題。 –