用于制作 ggplot2 图形和可选地与用户指定的列分面的 R 函数出现问题

Trouble with an R function for making a ggplot2 graph and optionally facetting with user-specified columns

我想在 R 中编写一个函数来制作一些图表,并且可以选择根据用户输入的任何列对这些图表进行分面。我更愿意使用非标准评估来执行此操作,因为我不知道用户将在他们输入的 data.frame 中包含哪些列。下面的代码有效,用户可以指定他们想要用什么颜色点的列:

 library(tidyverse)
 library(rlang)
 data("diamonds")
 
 myplot <- function(DF, colorBy){      
  colorBy <- rlang::enquo(colorBy)      
  ggplot(DF, aes(x = price, y = carat, color = !!colorBy)) +
        geom_point()      
  }
  
  myplot(diamonds, colorBy = cut)

但是我试图让用户指定要分面的列的这段代码失败了:

myplot_facet <- function(DF, colorBy, facetBy){
  
  colorBy <- rlang::enquo(colorBy)
  facetBy <- rlang::enquo(facetBy)
  ggplot(DF, aes(x = price, y = carat, color = !!colorBy)) +
        geom_point() +
        facet_wrap(. ~ !!facetBy)
 }
 
 myplot_facet(diamonds, colorBy = cut, facetBy = color)

我得到的错误是

Error: Quosures can only be unquoted within a quasiquotation context.

# Bad: list(!!myquosure)

# Good: dplyr::mutate(data, !!myquosure)

我不确定如何使用该错误消息来解决我的问题。 facet_wrapaes 的输入要求是否不同?我认为它们都使用整洁的语法调用 data.frame 中的列,所以我认为它们的工作方式相似。

作为一个更复杂的问题,我希望用户可以将 facetBy 设置为 NA(如果他们不想要分面)。

我一直在尝试阅读类似的问题(, , and ) and I'm trying to decipher the NSE chapter from "Advanced R",但我正在努力。None 其他问题 相当 什么我在问,“Advanced R”中的 NSE 章节超出了我的范围。

这个有效:

myplot_facet <- function(DF, colorBy, facetBy){
  
  facetBy <- enquo(facetBy)
  
  ggplot(DF, aes(x = price, y = carat, color = {{colorBy}} )) +
    geom_point() +
    facet_wrap(vars(!!facetBy))
}

myplot_facet(diamonds, colorBy = cut, facetBy = color)