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 check
NOTES,"只要你还导入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)
随着更多变量被引用,冗长度也会增加.但是,我不想在下划线版本中使用较不详细的语法,因为它已被弃用.
对于某些函数,以包为前缀调用它们会产生错误吗?
没错,但我们可以让它们发挥作用,让事情变得更加可预测。您可以为此功能提交一个 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.