将列名作为点-点-点传递以在 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()
函数,以便它们可以被传递给内部函数。
我想到了一个可爱的 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()
函数,以便它们可以被传递给内部函数。