dplyr 0.7.0 tidyeval in package

AJP*_*123 13 r dplyr r-package tidyeval rlang

前言

我通常dplyr在我的包中使用.在此之前0.7.0,我使用dplyr动词的强调版本来避免在注释期间R CMD CHECK.例如,代码:

x <- tibble::tibble(v = 1:3, w = 2)
y <- dplyr::filter(x, v > w)
Run Code Online (Sandbox Code Playgroud)

本来会产生这样的R CMD CHECK说明:

* checking R code for possible problems ... NOTE
no visible binding for global variable ‘v’
Run Code Online (Sandbox Code Playgroud)

相比之下,使用标准评估版:

y <- dplyr::filter_(x, ~v > w)
Run Code Online (Sandbox Code Playgroud)

没有发出这样的说明.

但是,使用dplyr编程dplyr 0.7.0的插图表示在包中包含函数的适当语法(以避免注释)是:dplyr

y <- dplyr::filter(x, .data$v > .data$w)
Run Code Online (Sandbox Code Playgroud)

因此,新闻文件说"不再需要每个主要动词的强调版本,因此这些功能已被弃用(但为了向后兼容性而保持不变)."

小插图说上面的新语法不会产生R CMD checkNOTES,"只要你还导入rlang::.data@importFrom rlang .data." 但是,当我运行代码时:

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

这个错误是否与以下类似?

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

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

评论

顺便说一句,dplyr使用0.7.0中的新语法编写包友好函数是否有一种不那么冗长的方式?特别是,语法为dplyr >=0.7.0:

y <- dplyr::filter(x, .data$v > .data$w)
Run Code Online (Sandbox Code Playgroud)

比以下语法更冗长dplyr <0.7.0:

y <- dplyr::filter_(x, ~v > w) 
Run Code Online (Sandbox Code Playgroud)

随着更多变量被引用,冗长度也会增加.但是,我不想在下划线版本中使用较不详细的语法,因为它已被弃用.

Lio*_*nry 3

对于某些函数,以包为前缀调用它们会产生错误吗?

没错,但我们可以让它们发挥作用,让事情变得更加可预测。您可以为此功能提交一个 github 问题。

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

The alternative is to declare all your column symbols to R, e.g. within a globalVariables(c("v", "w")) statement somewhere in your package.

Ideally, R should know about NSE functions and never warn for unknown symbols in those cases.