【发布时间】: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 的最佳实践是什么?
【问题讨论】:
在dplyr 中可以编写如下代码,例如使用 '。'引用管道中的数据
x <- data.frame(x = 2:4)
y <- data.frame(y = 1:3)
y %>% dplyr::bind_cols(x,.)
但是当在函数中使用它并运行包检查时,它会产生
全局变量“.”没有可见的绑定。
处理 NOTE 的最佳实践是什么?
【问题讨论】:
似乎最好的做法是使用.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) 等
现在的最佳做法是可能使用 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(".") 也可以,但我不是它的忠实粉丝。我担心当. 被不当使用时,这可能会阻止有意义的消息。我不知道那会是什么样子……我只是普遍偏执。
. 本身。