没有 `aes_string()` 的 ggplot2 标准评估

standard eval with ggplot2 without `aes_string()`

我想将带引号的字符串传递给调用 ggplot2 的函数。

library(magrittr); library(ggplot2)
g1 <- function( variable ) {
  ggplot(mtcars, aes_string("wt", variable, size="carb")) +
    geom_point()
}
g1("mpg")

这很好用,但是 v3.1.0 documentation 提倡准引用和 NSE aes()

All these functions are soft-deprecated. Please use tidy evaluation idioms instead (see the quasiquotation section in aes() documentation).

但是 aes() examples 使用 NSE(ieg1(mpg) 而不是 g1("mpg"))。同样,这些 SO 解决方案使用 NSE 值或 aes_()/aes_string()

我希望函数接受 SE/quoted 字符串,以容纳字符向量,例如:

variables <- c("mpg", "cyl", "disp")
variables %>% 
  lapply(g1)

一种解决方法是用通用名称替换函数中感兴趣的变量名称:

g1 <- function( variable ) {
  colnames(mtcars) <- gsub(variable, "variable", colnames(mtcars))
  ggplot(mtcars, aes(x=wt, y=variable, size=carb)) +
    geom_point() + ylab(variable)
}

variables <- c("mpg", "cyl", "disp")
variables %>% 
  lapply(g1)

您可以在调用 sym 后对变量使用 !! 运算符来执行此操作。这将在周围环境中取消引用并评估 variable

library(rlang)
g1 <- function( variable ) {
  ggplot(mtcars, aes(x = wt, y = !! sym(variable) , size = "carb")) +
    geom_point()
}
g1("mpg")

variables <- c("mpg", "cyl", "disp")
variables %>% 
  lapply(g1)