2010-01-26 46 views
3

有沒有一種方法,在R,如果一個函數使用一個變量 在函數體沒有宣佈彈出一個錯誤信息:即,我希望有人將此類型的功能我們可以有更多的錯誤(消息)?

aha<-function(p){ 
    return(p+n) 
} 

看到;如果碰巧有一個「n」變量位於某處,那麼aha(p = 2)會給我一個「答案」,因爲R從這個神祕的地方取名爲「環境」只需要「n」

+4

這通常被稱爲'特徵':)順便說一下,在C或C++中,它將與從本地函數到下一層(通常是全局)的範圍一致。 – 2010-01-26 17:28:44

回答

18

如果要在代碼寫入階段檢測到這些潛在問題,不是在運行期間,那麼codetools包是你的朋友。

library(codetools) 
aha<-function(p){ 
    return(p+n) 
} 

#check a specific function: 
checkUsage(aha) 

#check all loaded functions: 
checkUsageEnv(.GlobalEnv) 

這些會告訴你,no visible binding for global variable ‘n’

1

寫R檢查其他R代碼的代碼將會非常棘手。您必須找到一種方法來確定哪些代碼位是變量聲明,然後嘗試確定它們是否已在函數中聲明。 編輯:前面的說法是真實的,但正如Aniko指出的那樣,codetools包中已經完成了艱苦的工作。

對您而言可能有用的一件事是強制從函數本身(而不是封閉環境)獲取變量。

由於n未被聲明,所以此函數的此修改版本將始終失敗。

aha <- function(p) 
{ 
    n <- get("n", inherits=FALSE) 
    return(p+n) 
} 
5

裏奇的建議是非常好的。

我只是補充一點,你應該考慮創建一個可以在乾淨的R環境下運行的單元測試用例。這也將消除對全局變量的關注,並確保您的功能按照他們應該的方式行事。您可能需要考慮使用RUnit。我有我的測試套件計劃每天晚上在使用RScript的新環境中運行,這非常有效,可以捕捉任何類型的示波器問題等。

+0

+1對於整潔的環境 - 這就是我一直使用小寫字母'r'的原因,如果你在一個我們不支持小寫字母的平臺上有Rscript。 – 2010-01-26 17:39:45