我正在尝试编写一个绘图函数,您可以在其中传递裸列名称以选择要绘制的列。我还希望能够指定一个字符串作为颜色。

我发现如果要将字符串传递给aes_string,则需要使用shQuote。现在我的问题是找出是否传递了裸名或字符串。
我该怎么做?

dat <- data.frame(
    time = factor(c("Lunch","Dinner"), levels=c("Lunch","Dinner")),
    total_bill = c(14.89, 17.23)
)



plot_it <- function(dat, x,y, fill){
    require(rlang)
    require(ggplot2)

    x <- enquo(x)
    y <- enquo(y)
    fill <- enquo(fill)

    xN <- quo_name(x)
    yN <- quo_name(y)
    fillN <- quo_name(fill)

ggplot(data=dat, aes_string(x=xN, y=yN, fill=fillN)) +
    geom_bar(stat="identity")

}

这有效:
plot_it(dat, time, total_bill, time)

这不是:
plot_it(dat, time, total_bill, "grey")

请注意,这需要最新版本的rlang和ggplot2。

最佳答案

your answerEumenedies' answer/test cases工作,这是一个版本:

  • 解决您的原始问题
  • 防止不必要的图例,就像Eumenedies所做的一样
  • 提供可以无误添加到的ggplot对象
  • 根据Eumenedies的建议
  • 使用更合适的geom_col
    主要技巧是,如果fill不是情节中的一个因素,则您希望将其放在aes/aes_string块之外。
    plot_it <- function(dat, x, y, fill) {
    
      lst <- as.list(match.call())
    
      xN <- quo_name(enquo(x))
      yN <- quo_name(enquo(y))
    
      if(is.character(lst$fill)) {
        p <- ggplot(data=dat, aes_string(x=xN, y=yN)) +
          geom_col(fill = fill)
      } else {
        p <- ggplot(data=dat, aes_string(x=xN, y=yN, fill = quo_name(enquo(fill)))) +
          geom_col()
      }
    
      return(p)
    }
    
    plot_it(dat, time, total_bill, time)
    plot_it(dat, time, total_bill, "blue")
    plot_it(dat, time, total_bill, "blue") + geom_point()
    

    您可以通过将第二种情况下的if美感移至fill调用来缩短geom_col块,但是如果添加更多几何,则会以不同的方式扩展。

    另外,一旦ggplot更新为支持rlang,避免使用aes_stringquo_name组合会更清洁,而只需使用!!fill即可。

    请注意,假设存在fill因子,如果它始终与x因子相同,那么使用fill是可选参数的版本可能更有意义。如果包含该参数,则仅覆盖默认的每个因数颜色。

    关于r - 如何检测裸变量或字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43974780/

    10-12 17:11