在函数 dplyr 中将变量名转换为字符串

Turn variable name into string inside function dplyr

我正在做一些简单的事情,但 tidyeval 总是让我困惑。在这种情况下,我有一个函数可以绘制一些东西,之后我还想使用我正在绘制的列的名称保存它,如下所示:

bar_plot= function(table, col_plot){
    ggplot(table, aes(x=region,
                    y= {{col_plot}})) + 
geom_bar(stat = "identity", fill="steelblue") +
     ggsave(glue('results/{col_plot}.png'))
  
}

情节没有问题,但我无法保存它(找不到对象,因为它没有将其作为字符串读取)。尝试使用 quoenquosym,但没有任何效果。有什么方法可以在函数内部把我的变量名变成字符串?

为了可重复性,这就足够了:

df = data.frame(region = c(1, 2), mean_age = c(20, 30))

谢谢!

你可以这样做:

bar_plot <- function(table, col_plot) {
  
  p <- ggplot(table, aes(region, {{col_plot}})) + geom_col(fill = "steelblue")
  
  ggsave(paste0('results/', deparse(substitute(col_plot)), '.png'), p)
  
}

bar_plot(df, mean_age)

所以你有:

./results/mean_age.png

把绘图部分抽象出来,重点放在文件名上,我想你也可以在这里使用rlang::as_name将符号转换成你需要的字符串。

library(ggplot2)

df <- data.frame(region = c(1, 2), mean_age = c(20, 30))

bar_plot <- function(table, col_plot) {
  # ggplot(table, aes(
  #   x = region,
  #   y = {{ col_plot }}
  # )) +
  #   geom_bar(stat = "identity", fill = "steelblue")
  filename <- glue::glue("results/{rlang::as_name(enquo(col_plot))}.png")
  filename
}

bar_plot(df, mean_age)
#> results/mean_age.png

请注意,我们需要做两件事:首先将参数 col_plot 包装在 enquo 中,因此我们得到 mean_age 而不是字面上的 col_plot。然后用as_name()转换,把mean_age变成"mean-age".