• R语言
  • 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 dplyrUsing ggplot2 in packages,这俩应该是现在常用的入门的guidance。

关于!!可以看Tidy eval helpersInjecting with !!, !!!, and glue syntax

另外在{{的文档页里提到其实{{就是enquo!!的组合。以及rlang网站的这里,还有rlang网站中!!的文档页都提到在一般任务中尽量回避使用!!

这些都是偏向于从使用的角度谈问题,如果想更深入了解的话,我想推荐Advanced R里的Metaprogramming一章

    4 天 后

    • {{ }}(curly-curly 算符): 若只是传递,可将“冻结+ 注入” 合成
    一步
    • enquo() 和!!(引用与反引用):不只是传递,而是在冻结和注入之间
    仍需要做额外操作