dplyr 。和 _no 对全局变量 '.' 的可见绑定 _ 包检查中的注意事项
Posted
技术标签:
【中文标题】dplyr 。和 _no 对全局变量 \'.\' 的可见绑定 _ 包检查中的注意事项【英文标题】:dplyr . and _no visible binding for global variable '.'_ Note in package checkdplyr 。和 _no 对全局变量 '.' 的可见绑定 _ 包检查中的注意事项 【发布时间】:2018-07-22 20:15:35 【问题描述】:在dplyr
中可以编写如下代码,例如使用 '。'引用管道中的数据
x <- data.frame(x = 2:4)
y <- data.frame(y = 1:3)
y %>% dplyr::bind_cols(x,.)
但是当在函数中使用它并运行包检查时,它会产生
全局变量“.”没有可见的绑定。
处理 NOTE 的最佳实践是什么?
【问题讨论】:
【参考方案1】:似乎最好的做法是使用.data
而不是.
,然后使用rlang
包中的import .data
。来自programming with dplyr
vignette:
如果此函数在一个包中,使用 .data 还可以防止 R CMD check 给出关于未定义全局变量的注释(前提是您还使用 @importFrom rlang .data 导入了 rlang::.data)。
不幸的是,这不适用于dplyr::bind_cols
的原始问题,但它适用于例如dplyr::mutate
和dplyr::do
。
【讨论】:
谢谢。似乎是要走的路。一旦我尝试过,我会接受你的回答。祝你有美好的一天。 它也不适用于例如all_vars(. < 3)
应用程序或any_vars(. < 4)
等【参考方案2】:
现在的最佳做法是可能使用 quosures。 This other SO post有一个很好的总结:How to evaluate a constructed string with non-standard evaluation using dplyr?
实际上,我只是将. = NULL
包含在我的函数顶部。
编辑
正如@MrFlick 指出的那样,在这种情况下,quosures 实际上没有帮助。您可以可行地使用 quosures 来定义列名等,这样您就可以避免有关包函数中非标准评估的注释(我还没有这样做,但它在我的待办事项列表中至少有一个我的包),但您实际上不能使用此策略将值传递到指定的参数或位置
.
。
值得指出的是,至少有some overhead with using pipes。最好的做法可能是在你的包函数中根本不使用管道,这可以解决使用.
的问题。对于带有dplyr
commands 的 NSE 的其余部分,您可以使用 quosures。
【讨论】:
使用utils::globalVariables(".")
也可以,但我不是它的忠实粉丝。我担心当.
被不当使用时,这可能会阻止有意义的消息。我不知道那会是什么样子……我只是普遍偏执。
在这里使用 quosure 有什么帮助?那些不也只是使用符号作为参数吗?那些不会仍然是未定义的吗?
@MrFlick,你是对的——你可以对命名列等使用 quosures,但没有很好的方法来处理 .
本身。以上是关于dplyr 。和 _no 对全局变量 '.' 的可见绑定 _ 包检查中的注意事项的主要内容,如果未能解决你的问题,请参考以下文章