13

前言

我通常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)

没有产生这样的注释。

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

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

因此,新闻文件说“不再需要每个主要动词的下划线版本,因此这些功能已被弃用(但为了向后兼容而保留)。”

问题

小插图说上面的新语法不会产生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.

此错误是否类似于以下错误?

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) 

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

4

2 回答 2

3

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

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

使用 0.7.0 中的新语法编写对包友好的 dplyr 函数是否有更简洁的方法?

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

理想情况下,R 应该了解 NSE 函数,并且在这些情况下从不警告未知符号。

于 2017-06-23T06:04:54.547 回答
2

另一种解决方法是添加行,例如

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

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

于 2017-07-15T16:54:18.750 回答