将列名作为点-点-点传递以在 qplot() 上进行非标准评估

Passing column names as dot-dot-dot for non-standard evaluation on qplot()

我想到了一个可爱的 map + ... 用于 purrr 研讨会的用例:将 data.frame 拆分为 data.frame 的列表,然后绘制它们单独通过 qplot(...) 电话。

groups_of_plots <- function(data, group, ...){
  table_list <- split(data, data[[group]])

  plots <- purrr::map(.x = table_list, 
                      .f = ~ggplot2::qplot(data = .x, ...))
  return(plots)
}

但是当我像往常一样直接调用函数时,我得到了这个错误,这似乎是 x 作为 qplot 的美学参数的非标准评估的问题(制作它是函数定义中的一个固定参数使其工作,但当然使该函数基本上无用)

groups_of_plots(data = iris, 
                group = 'Species', 
                x = Sepal.Length)

error/rlang_error>
    Unknown input: data.frame
Backtrace:
    1. (function (x, ...) ...
    2. ggplot2:::print.ggplot(x)
    4. ggplot2:::ggplot_build.ggplot(x)
    5. ggplot2:::by_layer(function(l, d) l$compute_aesthetics(d, plot))
    6. ggplot2:::f(l = layers[[i]], d = data[[i]])
    7. l$compute_aesthetics(d, plot)
    8. ggplot2:::f(..., self = self)
    9. ggplot2:::is_calculated_aes(aesthetics)
    10. base::vapply(aesthetics, is_calculated, logical(1), USE.NAMES = FALSE)
    11. ggplot2:::FUN(X[[i]], ...)  

我真的很想坚持 qplot,不仅是为了简单,而且因为在我看来,这是一个很好的实例示例,您不想也不能在其中明确指定所有可能的参数你的函数定义,但据我所知,它只支持将美学作为非标准评估传递,这让事情变得相当复杂。

问题是带有 map 的函数的 ~ 快捷方式重新调整了干扰参数放置的 ... 符号的用途。一个可能的解决方法是

groups_of_plots <- function(data, group, ...){
  table_list <- split(data, data[[group]])
    
  plots <- purrr::map(.x = table_list, 
                      .f = function(.x, ...) ggplot2::qplot(data = .x, ...), ...)
  return(plots)
}

这里我们创建了具有 ... 值的函数,并将它们传递给内部函数,我们还必须将它们传递给 map() 函数,以便它们可以被传递给内部函数。