包中的 dplyr 0.7.0 tidyeval

dplyr 0.7.0 tidyeval in packages

序言

我通常在我的包中使用 dplyr。在 0.7.0 之前,我使用带下划线的 dplyr 动词来避免 R CMD CHECK 期间的注释。例如代码:

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 表示 "the underscored version of each main verb is no longer needed, and so these functions have been deprecated (but remain around for backward compatibility)."

问题

小插图说上面的新语法不会产生 R CMD check 注释,"provided that you’ve also imported rlang::.data with @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.

即,对于某些函数,以包为前缀调用它们会产生错误? (也许与它们是否已被导出有关?)

评论

顺便说一句,是否有更简洁的方法来使用 0.7.0 中的新语法编写对包友好的 dplyr 函数?特别是 dplyr >=0.7.0:

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

dplyr <0.7.0:

的语法更冗长
y <- dplyr::filter_(x, ~v > w) 

并且随着更多变量被引用而变得冗长。但是,我不想在带下划线的版本中使用不太冗长的语法,因为它已被弃用。

for some functions, calling them prefixed with the package yields errors?

没错,但我们可以让他们努力让事情变得更可预测。您可以为此功能提交 github 问题。

is there a less verbose way of writing package-friendly dplyr functions with the new syntax in 0.7.0?

另一种方法是将所有列符号声明为 R,例如在包裹某处的 globalVariables(c("v", "w")) 语句中。

理想情况下,R 应该了解 NSE 函数并且在这些情况下永远不会对未知符号发出警告。

另一种解决方法是添加诸如

之类的行
v <- NULL; # mark as not an unbound global reference

就在生成 CRAN 检查的表达式上方。它同样准确(列名实际上不是全局变量)并且范围有限。