dplyr 0.7.0 中的 tidyeval 打包。

13

前言

我经常在我的包中使用dplyr。在0.7.0之前,我使用下划线版本的dplyr动词来避免在R CMD CHECK期间出现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中,文档使用dplyr编程表明在打包时包含dplyr函数(以避免注意事项)的适当语法为:
y <- dplyr::filter(x, .data$v > .data$w)

因此,新闻文件指出:“不再需要每个主要动词的下划线版本,因此这些函数已被弃用(但为了向后兼容而保留)。” 问题 vignette说上述新语法不会产生R CMD check NOTES,“前提是您还使用@importFrom rlang .data导入了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) 

当引用更多的变量时,冗长度会增加。然而,我不想使用下划线版本的简洁语法,因为它已经被弃用。

2个回答

3

对于一些函数,使用包名前缀调用会导致错误?

没错,但我们可以使它们正常运行以提高可预测性。你可以在Github上提交一个问题来请求这个功能。

在0.7.0中的新语法中,是否有更简洁的编写适用于包的dplyr函数的方法?

另一种方法是将所有列符号声明给R,在你的包中的某个地方使用globalVariables(c("v", "w"))语句来实现。

理想情况下,R应该知道非标准评估函数,并且在这种情况下永远不会警告未知符号。


谢谢。我应该将问题归为 dplyr 还是 rlang - user3646834
你可以在dplyr中进行文件操作。 - Lionel Henry

2
另一个解决方法是添加类似于

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

在生成CRAN检查的表达式之上,有一个较为准确且范围有所限制的方法。这个方法并不会将列名误认为是全局变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接