使用ggplot2进行标准评估,而不使用`aes_string()`函数。

13

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

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

这个方法很有效,但v3.1.0文档提倡准引用和NSE aes()

所有这些函数都已被软弃用。请改用整洁评估惯用语(请参见aes()文档中的准引用部分)。

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

我希望该函数接受一个SE/引用字符串,以适应字符向量,例如:

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

1
请参考这个链接:https://dev59.com/d2Up5IYBdhLWcg3wXGu8#54755181 - Tung
1
我是否理解这个和@Croote的回答之间的区别?这里使用的是ensym()而不是sym()?还有其他的区别或稳定性上的优势吗? - wibeasley
请查看此链接 https://adv-r.hadley.nz/quasiquotation.html - Tung
2个回答

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

您可以在调用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)

4
一个解决方法是在函数中用一个常见的名称替换你感兴趣的变量名称:
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())。 - wibeasley
2
顺便说一下,我可能会将gsub()更改为sub()并收紧模式,以便它必须完全匹配(不仅是变量名中的某个位置)。也许像paste0("^", variable, "$")这样的东西。或者用dplyr::rename()替换名称,然后使用!! - wibeasley

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