¿Cómo replicar la misma expresión con el operador de tubería tidyverse en R?
Me gustaría resaltar los valores correspondientes en cada columna de los datos utilizando DT::datatable
.
Por ejemplo:
library(tidyverse)
data(mtcars)
mtcars <- mtcars %>% mutate(across(everything(), as.character))
datatable(mtcars[, c("vs", "am")]) %>%
formatStyle("vs", backgroundColor = styleEqual(rep(0, sum(mtcars$vs == 0)), rep("yellow", sum(mtcars$vs == 0)))) %>%
formatStyle("am", backgroundColor = styleEqual(rep(1, sum(mtcars$am == 1)), rep("yellow", sum(mtcars$am == 1))))
En el caso real, tengo múltiples columnas y me gustaría iterar sobre todas las columnas para agregar formatStyle
. ¿Existe alguna forma de replicar el %>% formatStyle()
en el bucle?
<h1>algo para comenzar</h1>
<p>l <- list()
l[["vs"]] <- 0
l[["am"]] <- 1</p>
<p>datatable(mtcars[, c("vs", "am")]) %>%
lapply(l, function(i) {
i ... # múltiples formatStyle()
})
El propósito de la iteración en cada columna no es resaltar el 1
en vs
ni el 0
en am
.
¡Gracias!
davy.ai
Sí, puedes usar
lapply
para iterar a través de cada columna y aplicar la funciónformatStyle
a cada una. Aquí tienes un ejemplo de código para lograr esto:“`{r}
library(DT)
library(tidyverse)
Cargar datos de ejemplo
data(mtcars)
mtcars <- mtcars %>% mutate(across(everything(), as.character))
Definir una lista de columnas en las que se aplicará formatStyle
cols <- c(“vs”, “am”)
Crear una lista de argumentos para pasar a formatStyle
format_args <- lapply(cols, function(col) {
# Definir el color de fondo basado en los valores únicos de la columna
bg_colors <- setNames(rep(“yellow”, length(unique(mtcars[[col]]))), unique(mtcars[[col]]))
styleEqual(mtcars[[col]], bg_colors)
})
Aplicar formatStyle a cada columna usando lapply y reduce
datatable(mtcars[, cols]) %>%
reduce(formatStyle, args = format_args)
“`
En este fragmento de código, primero definimos la lista de columnas a las que se aplicará
formatStyle
(cols
). Luego, usamoslapply
para iterar a través de cada columna y crear una lista de argumentos para pasar aformatStyle
. En este caso, definimos el color de fondo para cada valor único en la columna usandosetNames
yrep
, y luego usamosstyleEqual
para crear el argumento paraformatStyle
.Finalmente, aplicamos
formatStyle
a cada columna usandoreduce
de paquetepurrr
, pasando la lista de argumentos creada porlapply
. Esto produce unadatatable
con los valores correspondientes resaltados en cada columna.