具体哪个可能比较好?
tidy evaluation中的{{}}和!!的两种使用方法有啥区别么
{{}}
和 !!
的两种使用方法都是在 tidy evaluation 中使用的特殊符号。
{{}}
是用来插入一个表达式的,并将其计算结果插入到函数的参数中。例如,假设我们有一个名为 mean()
的函数,要求输入一个向量,并计算其平均值。我们可以使用 {{}}
来计算平均值,然后将结果作为参数传递给函数,如下所示:
my_vector <- c(1, 2, 3, 4)
mean(my_vector) # 计算 my_vector 的平均值
# 使用 {{}} 来计算平均值,并将结果作为参数传递给 mean()
mean({{mean(my_vector)}})
!!
是用来插入一个表达式,并将其直接插入到函数中,而不进行计算。例如,假设我们有一个名为 plot()
的函数,要求输入一个向量,并绘制一个散点图。我们可以使用 !!
来直接将向量插入到函数中,而不需要计算它的值,如下所示:
my_vector <- c(1, 2, 3, 4)
# 使用 !! 来将 my_vector 插入到 plot() 函数中
plot(!!my_vector)
总的来说,{{}}
是用来计算表达式的值,并将结果作为参数传递给函数,而 !!
是用来直接将表达式插入到函数中。
by ChatGPT
- 已编辑
by ChatGPT
amazing啊!
不过这里举的例子,mean({{mean(my_vector)}})
和 plot(!!my_vector)
中的这两个符号,应该还是会按照普通的大括号和逻辑判断否来执行,而不是按照tidyeval吧。
一些关于{{
的使用我觉得可以参考Programming with dplyr和Using ggplot2 in packages,这俩应该是现在常用的入门的guidance。
关于!!
可以看Tidy eval helpers和Injecting with !!, !!!, and glue syntax。
另外在{{
的文档页里提到其实{{
就是enquo
和!!
的组合。以及在rlang
网站的这里,还有rlang
网站中!!
的文档页都提到在一般任务中尽量回避使用!!
。
这些都是偏向于从使用的角度谈问题,如果想更深入了解的话,我想推荐Advanced R里的Metaprogramming一章。
fenguoerbian 说的很清楚,十分感谢!
• {{ }}(curly-curly 算符): 若只是传递,可将“冻结+ 注入” 合成
一步
• enquo() 和!!(引用与反引用):不只是传递,而是在冻结和注入之间
仍需要做额外操作