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::mutatedplyr::do

【讨论】:

谢谢。似乎是要走的路。一旦我尝试过,我会接受你的回答。祝你有美好的一天。 它也不适用于例如all_vars(. &lt; 3) 应用程序或any_vars(. &lt; 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。最好的做法可能是在你的包函数中根本不使用管道,这可以解决使用. 的问题。对于带有dplyrcommands 的 NSE 的其余部分,您可以使用 quosures。

【讨论】:

使用utils::globalVariables(".") 也可以,但我不是它的忠实粉丝。我担心当. 被不当使用时,这可能会阻止有意义的消息。我不知道那会是什么样子……我只是普遍偏执。 在这里使用 quosure 有什么帮助?那些不也只是使用符号作为参数吗?那些不会仍然是未定义的吗? @MrFlick,你是对的——你可以对命名列等使用 quosures,但没有很好的方法来处理 . 本身。

以上是关于dplyr 。和 _no 对全局变量 '.' 的可见绑定 _ 包检查中的注意事项的主要内容,如果未能解决你的问题,请参考以下文章

使用dplyr汇总并保持相同的变量名称

R使用dplyr包对变量特征进行标准化(standardize)缩放操作

R dplyr:: 使用字符串变量重命名和选择

使用标准评估更改 dplyr::count 中的变量名称

使用 dplyr 对多个变量的所有可能组合进行分组

作为 dplyr 管道的一部分,将中间输出分配给 temp 变量