一段时间以来,我一直在尝试了解整洁的评估方法或如何在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社区会避开它?
答案 0 :(得分:2)
如果数据框包含var1
或var2
列,则这些列将由get()
而不是您环境中的对象拾取。
另外,由于您直接修改捕获的表达式,因此使用准引用可以更好地自动标记表达式。
答案 1 :(得分:1)
我对tidyeval不太熟悉,对此我可能是错的。我的理解是,整齐的评估对于稍微复杂一些的练习(例如将dplyr
或tidyr
与ggplot2
结合使用或处理多个参数(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)