带有 ggplot2 的标准 eval 没有 `aes_string()`

Posted

技术标签:

【中文标题】带有 ggplot2 的标准 eval 没有 `aes_string()`【英文标题】:standard eval with ggplot2 without `aes_string()` 【发布时间】:2019-03-13 00:49:29 【问题描述】:

我想将带引号的字符串传递给调用 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()

所有这些功能都已软弃用。请改用整洁的评估习语(请参阅 aes() 文档中的 quasiquotation 部分)。

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

Use dplyr SE with ggplot2 How to use dplyr's enquo and quo_name in a function with tidyr and ggplot2 Why does this aes tidyeval example from ggplot documentation throw an error?

我希望该函数接受 SE/带引号的字符串,以容纳字符向量,例如:

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

【问题讨论】:

也看到这个***.com/a/54755181/786542 我了解这与@Croote 的回应之间的区别吗?这使用ensym() 而不是sym()?在稳定性方面还有其他区别或优势吗? 看到这个adv-r.hadley.nz/quasiquotation.html 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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())。跨度> 顺便说一句,我可能会将 gsub() 更改为 sub() 并收紧模式,使其必须完全匹配(不仅仅是在变量名中间的某个位置)。也许像paste0("^", variable, "$") 这样的东西。或者用dplyr::rename()替换名字,我猜!!

以上是关于带有 ggplot2 的标准 eval 没有 `aes_string()`的主要内容,如果未能解决你的问题,请参考以下文章

用均值条形图及其标准差 ggplot2 总结数据框

ggplot2用于带有两个相同刻度标签的条形图

ggplot2 和带有负值的堆积条形图

ggplot2 facet_grid 带有构面标题

Python标准库 内置函数eval expression globals None locals None

ggplot2 散点图标签