包中的 dplyr 0.7.0 tidyeval
dplyr 0.7.0 tidyeval in packages
序言
我通常在我的包中使用 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 表示 "the underscored version of each main verb is no longer needed, and so these functions have been deprecated (but remain around for backward compatibility)."
问题
小插图说上面的新语法不会产生 R CMD check
注释,"provided that you’ve also imported rlang::.data
with @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.
即,对于某些函数,以包为前缀调用它们会产生错误? (也许与它们是否已被导出有关?)
评论
顺便说一句,是否有更简洁的方法来使用 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)
并且随着更多变量被引用而变得冗长。但是,我不想在带下划线的版本中使用不太冗长的语法,因为它已被弃用。
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 函数并且在这些情况下永远不会对未知符号发出警告。
另一种解决方法是添加诸如
之类的行
v <- NULL; # mark as not an unbound global reference
就在生成 CRAN 检查的表达式上方。它同样准确(列名实际上不是全局变量)并且范围有限。
序言
我通常在我的包中使用 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 表示 "the underscored version of each main verb is no longer needed, and so these functions have been deprecated (but remain around for backward compatibility)."
问题
小插图说上面的新语法不会产生 R CMD check
注释,"provided that you’ve also imported rlang::.data
with @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.
即,对于某些函数,以包为前缀调用它们会产生错误? (也许与它们是否已被导出有关?)
评论
顺便说一句,是否有更简洁的方法来使用 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)
并且随着更多变量被引用而变得冗长。但是,我不想在带下划线的版本中使用不太冗长的语法,因为它已被弃用。
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 函数并且在这些情况下永远不会对未知符号发出警告。
另一种解决方法是添加诸如
之类的行v <- NULL; # mark as not an unbound global reference
就在生成 CRAN 检查的表达式上方。它同样准确(列名实际上不是全局变量)并且范围有限。