我想对ggplot使用简洁的评估facet_grid
,但不知道如何允许缺少参数?
ggplot2
3.0.0引入了功能vars()
(请参阅新闻),例如在facet_grid中使用整洁的评估。但是我不清楚如何处理丢失/ NULL参数?
在下面的代码中,我该如何做而不将任何参数传递给wrap_by
(即使用p + wrap_by()
)都不会返回错误?
library(ggplot2)
#> Registered S3 methods overwritten by 'ggplot2':
#> method from
#> [.quosures rlang
#> c.quosures rlang
#> print.quosures rlang
p <- ggplot(mtcars, aes(wt, disp)) + geom_point()
wrap_by <- function(...) {
facet_wrap(vars(...), labeller = label_both)
}
p + wrap_by() #ERROR!
#> Can't subset with `[` using an object of class NULL.
用例:我想拥有一个定义构面变量的函数,但希望将其设为可选。
fac_by <- function(var_fac1, var_fac2) {
facet_grid(rows=vars(!!enquo(var_fac1)),
cols=vars(!!enquo(var_fac2)))
}
p+ fac_by(vs, am)
p+ fac_by(var_fac1=vs) # won't work
这里的问题是,理想情况下,我会允许任一行,两个col(理想情况下也不允许facet_grid(NULL, NULL)
),尽管使用似乎不可能)
你可以做 :
fac_by <- function(var_fac1, var_fac2) {
# retrieve the arguments from the call
args_ <- rlang::call_args(match.call())
# rename them (use na.omit on top of it if you have more arguments)
names(args_) <- c(var_fac1 = "rows", var_fac2 = "cols")[names(args_)]
# apply vars on them
args_ <- purrr::map(args_, vars)
# build the call
call_ <- as.call(c(quote(facet_grid),args_))
eval(call_)
}
p+ fac_by(vs, am)
p+ fac_by(var_fac1=vs)
使用if
和missing
将会更简单:
fac_by <- function(var_fac1, var_fac2) {
facet_grid(rows=if(missing(var_fac1)) NULL else enquos(var_fac1),
cols=if(missing(var_fac2)) NULL else enquos(var_fac2))
}
p+ fac_by(vs, am)
p+ fac_by(var_fac1=vs)
请注意,您可以使用enquos(var_fac1)
代替vars(!!enquo(var_fac1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句