用于制作 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_wrap
与 aes
的输入要求是否不同?我认为它们都使用整洁的语法调用 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)
我想在 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_wrap
与 aes
的输入要求是否不同?我认为它们都使用整洁的语法调用 data.frame 中的列,所以我认为它们的工作方式相似。
作为一个更复杂的问题,我希望用户可以将 facetBy
设置为 NA(如果他们不想要分面)。
我一直在尝试阅读类似的问题(
这个有效:
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)