name - facet_wrap()
pasar cadena a facet_grid: ggplot2 (2)
En ggplot2 puede pasar argumentos de caracteres dentro de una función definida por el usuario utilizando aes_string
. ¿Cómo puedes hacer lo mismo para la cuadrícula de facetas que toma una fórmula, no aes
?
FUN <- function(data, x, y, fac1, fac2) {
ggplot(data = data, aes_string(x=x, y=y)) +
geom_point() + facet_grid(as.formula(substitute(fac1 ~ fac2)))
}
FUN(mtcars, ''hp'', ''mpg'', ''cyl'', ''am'')
Con rlang
magic y las nuevas características de ggplot2 v3.0.0
que puedes hacer:
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'')
Tenga en cuenta que no utilizamos aes_string
, que está en desuso.
Personalmente, en estos casos me gusta usar una función que llamé glue_formula
(que hace referencia al paquete glue
):
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'')
No está aprobado por Tidyverse ( ver discusión interesante aquí ) pero me ha servido bien.
reformulate()
parece funcionar bien.
FUN <- function(data, x, y, fac1, fac2) {
ggplot(data = data, aes_string(x=x, y=y)) +
geom_point() + facet_grid(reformulate(fac2,fac1))
}
FUN(mtcars, ''hp'', ''mpg'', ''cyl'', ''am'')