整洁的eval vs base或get()vs sym()vs as.symbol()

时间:2019-04-30 22:34:23

标签: r tidyverse rlang tidyeval

一段时间以来,我一直在尝试了解整洁的评估方法或如何在tidyverse中使用变量,但是我似乎从未完全掌握它。

例如,我正在尝试将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 个答案:

答案 0 :(得分:2)

如果数据框包含var1var2列,则这些列将由get()而不是您环境中的对象拾取。

另外,由于您直接修改捕获的表达式,因此使用准引用可以更好地自动标记表达式。

答案 1 :(得分:1)

我对tidyeval不太熟悉,对此我可能是错的。我的理解是,整齐的评估对于稍微复杂一些的练习(例如将dplyrtidyrggplot2结合使用或处理多个参数(dot-dot-dot)更有用。这是一个函数,该函数采用...传递的分组变量,计算.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