借助rlang
的魔法和新版ggplot2 v3.0.0
的特性,您可以做到:
FUN <- function(data, x, y, fac1, fac2) {
ggplot(data = data, aes(x = !!ensym(x), y = !!ensym(y))) +
geom_point() +
facet_grid(eval(expr(!!ensym(fac1) ~ !!ensym(fac2))))
}
FUN(mtcars, 'hp', 'mpg', 'cyl', 'am')
请注意,我们不再使用已被软弃用的 aes_string 。
个人认为,在这些情况下,我喜欢使用一个我称之为 glue_formula 的函数(引用包)。
glue_formula <- function(.formula, .envir = parent.frame(), ...){
formula_chr <- gsub("\\n\\s*","",as.character(.formula)[c(2,1,3)])
args <- c(as.list(formula_chr), .sep=" ", .envir = .envir)
as.formula(do.call(glue::glue, args),env = .envir)
}
FUN2 <- function(data, x, y, fac1, fac2) {
ggplot(data = data, aes(x = !!ensym(x), y = !!ensym(y))) +
geom_point() + facet_grid(glue_formula({fac1} ~ {fac2}))
}
FUN2(mtcars, 'hp', 'mpg', 'cyl', 'am')
虽然它没有得到tidyverse的批准(在这里查看有趣的讨论),但它对我非常有用。
as.formula(paste(fac1,"~", fac2))
- baptiste