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

3

我有一个使用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}}))

我该如何解决这个问题?非常感谢您的帮助。

2个回答

1
你可以尝试这种方法:

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)

0
问题似乎在于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)

这是一个意外和令人惊讶的问题原因。如果我想使用facet_grid({{var.facet}} ~.),将var.facet转换为符号仍然会导致错误。我该如何使其正常工作?谢谢。 - Hi CLH
我已经尝试了一下,但还没有找到解决方案。到目前为止,我只使用了facet_wrap的公式符号表示法。我不完全确定那里发生了什么,但似乎公式符号表示法现在已经过时了,也许是因为新的NSE风格存在问题(例如,在facet_wrap的man页面中,公式样式被称为“经典界面”)? - starja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接