dplyr中出现了“全局变量'.'没有可见的绑定”的提示,这是在包检查时发现的。

22
dplyr 中,可以使用 '.' 来引用管道中的数据,例如可以写出这样的代码。
x <- data.frame(x = 2:4)
y <- data.frame(y = 1:3)

y %>% dplyr::bind_cols(x,.)

但是在使用函数并运行程序包检查时,会产生“no visible binding for global variable '.'.”的错误提示。

如何处理这个NOTE是最佳实践?

2个回答

14
看起来最佳实践是使用.data而不是.,然后从rlang软件包中导入.data。根据《使用dplyr进行编程》文献的说法:

如果此函数在软件包中,则使用.data也会防止R CMD检查对未定义全局变量提出“NOTE”(前提是您还使用@importFrom rlang .data导入了rlang::.data)。

不幸的是,这对于原始问题的dplyr::bind_cols不起作用,但是在dplyr::mutatedplyr::do示例中有效。


谢谢。看起来这是正确的方法。我一试就会接受你的答案。祝你有美好的一天。 - witek
2
它无法与例如 all_vars(. < 3) 应用程序或 any_vars(. < 4) 等一起使用。 - witek

8

现在最好的做法可能是使用quosures。这篇SO文章有一个很好的总结: 如何使用dplyr评估具有非标准评估的构造字符串?

实际上,我只是在我的函数顶部包含了. = NULL

编辑

正如@MrFlick指出的那样,quosures实际上在这种情况下并没有帮助。你可以使用quosures合理地定义列名等,以避免在包函数中出现关于非标准评估的注释(我还没有做到这一点,但这是我至少一个包的待办事项清单),但你实际上不能使用这个策略将值传递到指定的参数或位置,使用.

值得注意的是,使用管道至少存在 一些开销。也许最佳实践是在您的包函数中根本不使用管道,这样就可以避免使用 . 的问题。对于其余的使用dplyr命令的NSE,您可以使用quosures。

4
使用utils::globalVariables(".")也可以,但我不是它的忠实支持者。我担心当.被不适当地使用时,这可能会阻止有意义的消息。虽然我不知道那会是什么样子,但我总体上很谨慎。 - Benjamin
使用quosure会如何帮助这里?那些不也只是使用符号作为参数吗?它们仍然会未定义吗? - MrFlick
@MrFlick,你是对的——你可以使用引号来表示命名列等,但是处理 . 本身并没有很好的方法。 - mikeck

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