2011-11-11 38 views
34

我注意到,在檢查包,我獲得筆記「爲全局變量沒有明顯的結合」,當我使用功能,如subset使用列表元素作爲參數逐字名字。中的R CMD無可見約束力的全局變量注意檢查

例如與數據幀:

FOO < - data.frame(A = C(TRUE,FALSE,TRUE),B = 1:3)

我可以做愚蠢的東西,如:

subset(foo,a) 
transform(foo,a=b) 

其中按預期工作。然而,R CMD中的R代碼檢查並不理解這些引用了元素,並且抱怨沒有任何可見的全局變量綁定。

雖然這個工程確定,我真的不喜歡我的包中有筆記,更喜歡它沒有錯誤,警告和注意通過檢查在所有。我也不太想重寫我的代碼太多。有沒有辦法編寫這些代碼,以便清楚地表明參數不涉及全局變量?

+0

這可能有一些理由使得包爲了將來的R進化而變得更「可編譯」...... – mbq

+0

我注意到這個問題最近被重複了:http://stackoverflow.com/questions/9439256/how-can -i-handle -r-cmd-check-no-visible-binding-for-global-variable-notes-when但那裏的答案furt她的信息,其他人可能會覺得有用。 – cboettig

回答

40

爲了得到它過去R CMD check您可以:

  • 使用get("b")(但這是繁瑣)
  • a=b=NULL在你的函數中較高(這就是我)

有關於R-devel的線程前一陣子,其中從R核心有人說基本上(從內存中)指出:」都OK,你知道的。其假設是,筆者檢查了它,是確定注意「。但是,我同意你的看法。我更喜歡在所有平臺上使用CRAN檢查返回乾淨的「OK」。這樣用戶可以毫無疑問地通過檢查。

編輯:

這裏是r-devel thread我記得(從2010年4月)。所以這似乎表明,在某些情況下,沒有已知的方法來避免NOTE,但沒關係。

+0

謝謝。我會用這個,直到我有時間以適當的方式重新編碼:) –

+1

我不確定是否有正確的方法;)我認爲'a = b = NULL'就像C變量聲明一樣。這讓我覺得有點困難,併爲我吸引了一些錯誤,所以我不介意。 –

+3

@MattDowle看起來像C變量聲明的反義詞,因爲它告訴用戶「這些都是NULL」,而事實上該函數將依賴於它們不是被訪問的NULL。 – tim

17

這是使用subset非交互的潛在的「意外後果」之一。正如它在?subset的警告部分所述:

這是一個便利功能,旨在交互使用。對於 編程,最好是使用標準的子集的功能,如 「[」,並在特定的參數 「子集」的非標評價可以有意想不到的後果。

+4

認爲這個問題可能比「子集」更普遍。我已經看過幾次了。 –

+3

爲了強大的功能避免調用使用非標準評估的函數。 – hadley

+2

@hadley,但是對'foreach'的調用呢?......這些仍然引起同樣的注意。 – StevieP

9

根據?subset的警告部分,最好使用交互式子集和[進行編程。

我將代替命令等

subset(foo,a)

foo[foo$a]

,或者如果foo是一個數據幀:

foo[foo$a, ]

你可能還喜歡用with如果foo是一個數據框和表達進行評估是複雜的:

with(foo, foo[a, ])

+0

我很確定'with'會導致完全相同的問題,因爲'a'仍然沒有在環境中定義,只能在數據中定義。 – BrodieG

11

來自R版本2.15.1開始有解決的辦法:

if(getRversion() >= "2.15.1") utils::globalVariables(c("a", "othervar")) 
+4

yikes ..這是一個副作用只是爲了僞造子集被正確評估......如果CRAN只允許作者標記關於顯然(但不是實際上)錯誤的全局變量的註釋,那麼它會變得很不錯... – tim