La salida de purrr::pmap() no es compatible con lo que ggplot::aes() espera.
Problema: La salida de purrr::pmap()
es incompatible con ggplot::aes()
El siguiente reprex se reduce a una sola pregunta: ¿Hay alguna manera de usar los nombres de las variables entre comillas dentro de ggplot2::aes()
en lugar de los nombres de texto plano? Por ejemplo: usamos típicamente ggplot(mpg, aes(displ, cyl))
, ¿cómo hacer que aes()
funcione normalmente con ggplot(mpg, aes("displ", "cyl"))
?
Si comprendió mi pregunta, el resto de este reprex realmente no agrega información. Sin embargo, lo agregué para dar una imagen completa del problema.
Más detalles: quiero usar las funciones de purrr para crear una gran cantidad de gráficos de exploración de datos sin esfuerzo. El problema es que purrr::pmap()
proporciona los nombres de las variables entre comillas, que ggplot::aes()
no entiende. Según tengo entendido, las funciones cat()
y as.name()
pueden tomar el nombre de la variable entre comillas y devolverlo de la forma típica que aes()
entiende; sin comillas. Sin embargo, ninguna de ellas funcionó. El siguiente reprex reproduce el problema. He comentado el código para ahorrarle el dolor de entender lo que hace el código.
“`{r}
library(tidyverse)
Divida las clases de variables en numéricas y no numéricas. Objetivo: colocar una combinación de variables numéricas en los ejes y codificar una variable no numérica.
mpgnumeric <- maplgl(.x = seqalong(mpg), .f = ~ mpg[[.x]] %>% class() %in% c(“numeric”,”integer”))
mpgfactor <- maplgl(.x = seqalong(mpg), .f = ~ mpg[[.x]] %>% class() %in% c(“factor”,”character”))
crear todas las combinaciones posibles de las variables
edaroutinecombinations <- expandgrid(num1 = mpg[mpgnumeric] %>% names(),
num2 = mpg[mpgnumeric] %>% names(),
fct = mpg[mpgfactor] %>% names()) %>%
filter(num1 != num2) %>% slice_head(n = 2) # para simplificar, mantener solo las primeras 2 combinaciones
usar purrr::pmap() para crear todos los gráficos que queremos en una sola llamada
pmap(.l = list(edaroutinecombinations$num1,
edaroutinecombinations$num2,
edaroutinecombinations$fct) ,
.f = ~ mpg %>%
ggplot(aes(..1 , ..2, col = ..3)) +
geom_point() )
A continuación, se señala el problema utilizando una llamada típica de <em>ggplot2</em>.
esto es lo que queremos que <code>purrr::pmap()</code> cree en sus iteraciones:
<code>{r}
mpg %>%<br>
ggplot(aes(displ , cyl, fill = drv)) +
geom_boxplot()
</code>
Sin embargo, esto es lo que <code>purrr::pmap()</code> genera; nombres de variables entre comillas:
```{r}
mpg %>%
ggplot(aes("displ" , "cyl", fill = "drv")) +
geom_boxplot()
</code></pre>
<hr>
<h1>Intentos fallidos</h1>
El uso de <code>cat()</code> para transformar los nombres de las variables entrecomillas de <code>pmap()</code> en forma no entre comillas para que <code>aes()</code> los entienda falla.
<code>{r}
mpg %>%<br>
ggplot(aes(cat("displ") , cat("cyl"), fill = cat("drv"))) +
geom_boxplot()
</code>
El uso de <code>as.name()</code> para transformar los nombres de las variables entrecomillas de <code>pmap()</code> en forma no entre comillas para que <code>aes()</code> los entienda falla.
```{r}
mpg %>%
ggplot(aes(as.name("displ") , as.name("cyl"), fill = as.name("drv"))) +
geom_boxplot()
```
Conclusión
¿Hay alguna forma de hacer que ggplot(aes("nombre_variable_comillas"))
funcione correctamente?
davy.ai
Desafortunadamente,
ggplot(aes(""nombre_var_comillas""))
no funcionará como se espera. En general, ggplot2 está diseñado para trabajar con nombres de variables sin comillas, y el uso de nombres con comillas dentro deaes()
no funcionará correctamente.Una posible solución es usar el pronombre
.data
dentro deaes()
para referirse a variables en el conjunto de datos usando nombres con comillas. Por ejemplo:“`{r}
mpg %>%
ggplot(aes(.data[[“displ”]], .data[[“cyl”]], fill = .data[[“drv”]])) +
geom_boxplot()
Note que usamos
[[
en lugar de$
para extraer los nombres de variables, ya que[[
nos permite usar cadenas con comillas.Otro enfoque es usar
rlang::sym()
para convertir las cadenas con comillas en símbolos, y luego usar!!
para descomillarlas dentro deaes()
. Por ejemplo:“`{r}
var1 <- “displ”
var2 <- “cyl”
var3 <- “drv”
mpg %>%
ggplot(aes(!!rlang::sym(var1), !!rlang::sym(var2), fill = !!rlang::sym(var3))) +
geom_boxplot()