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

bur*_*ger 7 r tidyverse tidyeval rlang

一段时间以来,我一直试图了解 tidy eval 或如何在 tidyverse 中使用变量,但我似乎从未完全掌握它。

例如,我试图将 ggplot 与变量映射一起使用。这将是基本的 R 版本:

library(ggplot2)
var1 = "wt"
var2 = "mpg"
ggplot(mtcars, aes(x = get(var1), y = get(var2))) + geom_point()
Run Code Online (Sandbox Code Playgroud)

但是,根据我所看到的所有文档和讨论,“正确”的 quasiquotation 方式是:

ggplot(mtcars, aes(x = !!sym(var1), y = !!sym(var2))) + geom_point()
Run Code Online (Sandbox Code Playgroud)

也许这更类似于:

ggplot(mtcars, aes(x = !!as.symbol(var1), y = !!as.symbol(var2))) + geom_point()
Run Code Online (Sandbox Code Playgroud)

get()方法对我来说更短且更具可读性。为什么 tidyverse 社区会回避它?

Ree*_*oon 2

我对 tidyeval 不太熟悉,我对此可能是错的。我的理解是,整洁的评估对于稍微复杂的练习更有用,例如组合dplyror tidyrwith ggplot2,或处理多个参数(dot-dot-dot)。这里\xe2\x80\x99s 是一个函数,它接受由 传递的分组变量...,计算 的平均值,.summary_var然后绘制结果:

\n\n
library(tidyverse)\ngg_dummy_func <- function(.data, .summary_var, ...) {\n\n  summary_var <- enquo(.summary_var)\n  group_vars <- enquos(...)\n\n  sum_data <- .data %>%\n    group_by(!!!group_vars) %>%\n    summarise(mean=mean(!!summary_var))\n\n  gg <- ggplot(sum_data, aes(x=!!sym(names(sum_data)[1]), \n                             y=!!sym(names(sum_data)[2]),\n                             color=mean)) +\n    geom_point()\n  print(gg)\n}\n\n\ngg_dummy_func(mtcars, mpg, wt, cyl)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n