Tidy Eval与Base或Get() vs Sym() vs As.symbol()的比较

10

我一直在努力理解整洁评估或如何在整洁环境中使用变量,但似乎始终无法完全掌握。

例如,我正在尝试使用变量映射来使用ggplot。以下是基本的R版本:

library(ggplot2)
var1 = "wt"
var2 = "mpg"
ggplot(mtcars, aes(x = get(var1), y = get(var2))) + geom_point()

然而,根据我看到的所有文件和讨论,"正确的"准引用方式应该是:
ggplot(mtcars, aes(x = !!sym(var1), y = !!sym(var2))) + geom_point()

也许这更容易理解为:

ggplot(mtcars, aes(x = !!as.symbol(var1), y = !!as.symbol(var2))) + geom_point()

get()方法更短且更易读。为什么它被tidyverse社区避免使用呢?


2
就此而言,“旧”的使用ggplot与存储在字符中的美学映射的认可方式是使用aes_string()而不是get() - joran
一个区别是你的x和y轴标签是get(var1)get(var2)。我怀疑https://adv-r.hadley.nz/evaluation.html#quosures与此有关。 - Raoul Duke
@joran,我没有提到aes_函数,因为它们现在已经软弃用了,所以至少有一些原因不使用它们。 - burger
我认为这里发生的一部分可能是ggplot本身被重写以使用quosures;我觉得当我第一次学习ggplot时,以这种方式使用get会以意想不到的方式中断,因为评估方案更加脆弱。 - joran
2个回答

4
如果数据框中包含 var1var2 列,则该函数将选择这些列而不是您的环境中的对象。
此外,使用准引用可以获得更好的自动标签化表达式,因为您直接修改了捕获的表达式。

2
我对tidyeval不是非常熟悉,可能存在错误。据我所知,tidy evaluation在处理稍微复杂的练习时更有用,例如将dplyrtidyrggplot2合并,或处理多个参数(点-点-点)。以下是一个函数,它接受通过...传递的分组变量,计算.summary_var的平均值,然后绘制结果图表:

最初的回答
library(tidyverse)
gg_dummy_func <- function(.data, .summary_var, ...) {

  summary_var <- enquo(.summary_var)
  group_vars <- enquos(...)

  sum_data <- .data %>%
    group_by(!!!group_vars) %>%
    summarise(mean=mean(!!summary_var))

  gg <- ggplot(sum_data, aes(x=!!sym(names(sum_data)[1]), 
                             y=!!sym(names(sum_data)[2]),
                             color=mean)) +
    geom_point()
  print(gg)
}


gg_dummy_func(mtcars, mpg, wt, cyl)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接