使用 ggplot2 制作多个面板图的整洁评估

Tidy evaluation in making multiple panel plots using ggplot2

我有一个使用 ggplot2 制作多面板图的功能:

plot_facet <- function(df, var.x, var.y, var.facet) {
  p <- df %>% 
    ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
    geom_point()    
  
   if(!is_missing(var.facet)) p <- p + facet_grid({{var.facet}} ~ .)
  
  return(p)
}

以下调用按预期工作:

plot_facet(mtcars, mpg, hp) + facet_grid(cyl ~ .)

但这不是:

plot_facet(mtcars, mpg, hp, cyl)

我收到错误消息:

Error in is_reference(x, quote(expr = )) : object 'cyl' not found

这个我试过了,也没用:

facet_grid(rows = vars({{var.facet}}))

我该如何解决?感谢您的帮助。

你可以试试这个方法:

library(ggplot2)

plot_facet <- function(df, var.x, var.y, var.facet) {
  var <- deparse(substitute(var.facet)) 
  p <- df %>% 
    ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
    geom_point()    
  
  if(var != '') p <- p + facet_grid(reformulate('.', var))
  
  return(p)
}

两者都有效并产生相同的输出。

plot_facet(mtcars, mpg, hp) + facet_grid(cyl ~ .)
plot_facet(mtcars, mpg, hp, cyl)

问题似乎是 is_missing 评估太多(老实说,我从它的帮助页面看不出太多意义)。如果你只是使用 missing (它只对符号进行操作),你可以使用你的 facet_grid(rows = vars({{var.facet}})) 方法:

library(ggplot2)
library(magrittr)
library(rlang)

plot_facet <- function(df, var.x, var.y, var.facet) {
  p <- df %>% 
    ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
    geom_point()    
  
  if(!missing(var.facet)) p <- p + facet_grid(rows = vars({{var.facet}}))
  
  return(p)
}

plot_facet(mtcars, mpg, hp, cyl)

或者,您可以将 var.facet 转换为函数开头的符号,并将其与 is_missingrows 参数一起使用:

plot_facet <- function(df, var.x, var.y, var.facet) {
  var.facet <- ensym(var.facet)
  p <- df %>% 
    ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
    geom_point()    
  
  if(!is_missing(var.facet)) p <- p + facet_grid(rows = vars({{var.facet}}))
  
  return(p)
}

plot_facet(mtcars, mpg, hp, cyl)