r - dplyr 0.7.0 tidyeval 包

标签 r dplyr r-package rlang tidyeval

序言

我常用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说“不再需要每个主要动词的下划线版本,因此这些功能已被弃用(但为了向后兼容而保留)。”

问题

小插图说上述新语法不会产生 R CMD check注意,“前提是您还导入了 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) 

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

最佳答案

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 函数,并且在这些情况下永远不要警告未知符号。

关于r - dplyr 0.7.0 tidyeval 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44712189/

相关文章:

r - 将部分添加到 R 包的帮助/文档

r - is.na() 的行为与 is.numeric() 不同——一致性在哪里?

r - 具有多列输出的 mutate rnorm

r - 使用 R 中的 group_indices 或类似方法的特定于组的 ID 号

r - dplyr 用于逐行分位数

R:如何在加载包时运行一些代码?

r - 如何在我自己的包中使用 data.table::setDTthreads() ?

r - 选择特定位置具有指定碱基的所有样本

R刻度数据: merging date and time into a single object

javascript - shiny点击DT后弹窗