dplyr.和_no全局变量的可见绑定'.'_在包检查中注意

wit*_*tek 11 r pipe dplyr magrittr

dplyr一个人可以编写代码,例如使用'.' 引用管道中的数据

x <- data.frame(x = 2:4)
y <- data.frame(y = 1:3)

y %>% dplyr::bind_cols(x,.)
Run Code Online (Sandbox Code Playgroud)

但是当在一个函数中使用它并运行包时,检查它会产生

全局变量'.'没有可见的绑定.

处理NOTE的最佳做法是什么?

sha*_*dow 10

看来,最好的做法是使用.data替代.,然后使用进口.datarlang包。从带有dplyr小插图编程中

如果此函数在包中,使用 .data 还可以防止 R CMD 检查给出有关未定义全局变量的注释(前提是您还使用 @importFrom rlang .data 导入了 rlang::.data)。

不幸的是,这不适用于 的原始问题dplyr::bind_cols,但它适用于例如dplyr::mutatedplyr::do

  • 它不适用于例如 `all_vars(. &lt; 3)` 应用程序或 `any_vars(. &lt; 4)` 等。 (2认同)

mik*_*eck 7

现在的最佳实践可能是使用 quosures。另一个 SO 帖子有一个很好的总结:如何使用 dplyr 使用非标准评估来评估构造的字符串?

在实践中,我刚刚包含. = NULL在我的函数的顶部。

编辑

正如@MrFlick 指出的那样,在这种情况下,quosures 实际上并没有帮助。您可以可行地使用 quosures 来定义列名称等,这样您就可以避免在包函数中进行非标准评估的注释(我还没有这样做,但它在我的待办事项列表中至少有一个我的包),但您实际上不能使用此策略将值传送到指定的参数或位置.

值得指出的是,使用管道至少有一些开销。最佳实践可能是在包函数中根本不实际使用管道,这解决了使用.. 对于带有dplyr命令的 NSE 的其余部分,您可以使用 quosures。

  • 使用 `utils::globalVariables(".")` 也有效,但我不是它的忠实粉丝。我担心当 `.` 被不恰当地使用时,这可能会阻止一个有意义的消息。我不知道那会是什么样子……我只是普遍偏执。 (2认同)