2017-06-23 33 views
12

序言dplyr 0.7.0 tidyeval在包

我通常使用我的包dplyr。在0.7.0之前,我在R CMD CHECK期間使用dplyr動詞的下劃線版本來避免NOTE。例如,代碼:

x <- tibble::tibble(v = 1:3, w = 2) 
y <- dplyr::filter(x, v > w) 

會產生的R CMD CHECK注:

* checking R code for possible problems ... NOTE 
no visible binding for global variable ‘v’ 

相比之下,使用標準的評估版本:

y <- dplyr::filter_(x, ~v > w) 

沒有產生這樣的注意。

然而,在dplyr 0.7.0,暈影Programming with dplyr說,對包括在包中dplyr功能(以避免說明)適當的語法是:

y <- dplyr::filter(x, .data$v > .data$w) 

因此,news file說,「每個主的下劃線版本動詞不再需要,所以這些功能已被棄用(但爲了向後兼容而保留)。「

問題

暗角說,上述新的語法不會產生R CMD check指出:「只要你還進口rlang::.data@importFrom rlang .data。」但是,當我運行代碼時:

y <- dplyr::filter(x, rlang::.data$v > rlang::.data$w) 
Evaluation error: Object `From` not found in data. 

此錯誤與以下內容類似嗎?

y <- dplyr::filter(x, v == dplyr::n()) 
Evaluation error: This function should not be called directly. 

也就是說,對於一些函數,調用它們作爲前綴的包會產生錯誤? (事做他們是否已經出口,也許?)

評論

順便說一句,有沒有書面包友好dplyr功能在新的語法更簡潔的方式0.7.0?特別地,對於dplyr >=0.7.0的語法:

y <- dplyr::filter(x, .data$v > .data$w) 

比語法dplyr <0.7.0更詳細的:

y <- dplyr::filter_(x, ~v > w) 

和冗長隨着更多的變量被引用。但是,我不想使用帶有下劃線版本的較少冗長語法,因爲它已過時。

回答

3

對於某些函數,調用它們帶有前綴的包會產生錯誤?

這是對的,但我們可以讓他們工作,讓事情更具可預測性。您可以針對此功能提出github問題。

是否有一種較爲詳細的編寫友好的dplyr函數的方法,使用0.7.0中的新語法?

另一種方法是將所有列符號聲明爲R,例如,在你的包中的某個globalVariables(c("v", "w"))聲明中。理想情況下,R應該知道NSE的功能,並且在這些情況下從不警告未知符號。

+0

謝謝。我應該在'dplyr'還是'rlang'下提出問題? – AJP123

+0

你可以在dplyr檔案 – lionel

+0

全部完成。 https://github.com/tidyverse/dplyr/issues/2930 – AJP123

2

另一個解決辦法是增加線路,如

v <- NULL; # mark as not an unbound global reference 

略高於你的表情所產生CRAN檢查。它並不不準確(列名實際上不是全局變量),並且其範圍有所限制。