【问题标题】:ggplot2 Variable Name with Spaces and tidyeval Syntaxggplot2 带有空格和 tidyeval 语法的变量名
【发布时间】:2021-10-22 07:00:12
【问题描述】:

我正在尝试创建一个允许用户传入列名的函数,我发现生成的图只是屏幕中间的一个点。需要进行哪些更改才能使其按预期工作?我的极简示例是:

library(ggplot2)
weather <- data.frame(Month = month.name[1:5], `Low Temperature` = 20:16,
                      `High Temperature` = seq(30, 22, -2), check.names = FALSE)

xVariable <- "Month"
yVariable <- "High Temperature"
yVariable <- enquo(yVariable)
ggplot(weather, aes(x = xVariable, y = !!yVariable)) + geom_point()

【问题讨论】:

    标签: r ggplot2 tidyeval


    【解决方案1】:

    因为它是引用文本,而不是enquo,所以使用rlang::sym

    xVariable <- "Month"
    yVariable <- "High Temperature"
    fun <- function(dat, xvar, yvar) {
      xvar <- rlang::sym(xvar)
      yvar <- rlang::sym(yvar)
      p1 <-dat %>%
        ggplot(aes(x = !!xvar, y = !!yvar)) +
        geom_point()
      return(p1)
      
    }
    
    
    fun(weather, xVariable, yVariable)
    

    【讨论】:

    • 我认为使用.data 会更好。它的技术性较低(没有!! 注入)并且不那么脆弱(仅在数据范围内,如果列意外不存在,则没有与环境变量发生冲突的风险)。我添加了一个使用 .data 的答案的变体。
    【解决方案2】:

    您可以使用aes_string 代替aes

    library(ggplot2)
    weather <- data.frame(Month = month.name[1:5], `Low Temperature` = 20:16,
                          `High Temperature` = seq(30, 22, -2), check.names = FALSE)
    
    xVariable <- "Month"
    yVariable <- "`High Temperature`"
    
    ggplot(weather, aes_string(x = xVariable, y = yVariable)) + geom_point()
    

    【讨论】:

    • 我最初有 aes_string,但根据其 NEWS 文件,自 ggplot2 版本 3.0.0 以来它已被弃用。
    【解决方案3】:

    请注意,enquo()用于函数参数。

    如果您将列名作为字符串,请使用.data 代词:

    fn <- function(data, x, y) {
      data %>%
        ggplot(aes(x = .data[[x]], y = .data[[y]])) +
        geom_point() 
    }
    
    x <- "disp"
    y <- "drat"
    
    fn(mtcars, x, y)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2020-11-19
      • 1970-01-01
      • 2012-11-12
      相关资源
      最近更新 更多