Tenho um quadro de dados que contém cerca de 15 variáveis de interesse e pretendo preencher condicionalmente os valores com base em alguns critérios usando a pill_buttons()
função no reactablefmtr
pacote.
Os dados fictícios abaixo tentam simular meus dados reais, mas para o propósito deste post, eu apenas usei 3 variáveis em vez de 15 ou mais. var1_z
, var2_z
etc. são pontuações z que correspondem à coluna homônima. Eu então crio colunas adicionais que fazem referência à cor que eu gostaria que os respectivos valores fossem coloridos na tabela.
library(tidyverse)
library(reactable)
library(reactablefmtr)
cell_bg <- function(x){
case_when(
x > 1.5 ~ "red",
x < -1.5 ~ "lightblue",
.default = "transparent"
)
}
set.seed(1)
ex <- data.frame(
date = seq(Sys.Date(), Sys.Date() - 9, -1),
var1 = round(rnorm(10, 8000, 500)),
var2 = round(rnorm(10, 500, 50)),
var3 = round(rnorm(10, 100, 20)),
var1_z = round(runif(10, -3, 3), 2),
var2_z = round(runif(10, -3, 3), 2),
var3_z = round(runif(10, -3, 3), 2)
) %>%
mutate(
across(
.cols = var1_z:var3_z,
.fns = cell_bg,
.names = "{.col}_pal"
)
)
Estou familiarizado com o uso da pill_buttons()
função, conforme exibido abaixo no meu conjunto de dados fictício. No entanto, é repetitivo e tedioso completar cada função para cada variável, como fiz abaixo, bem como codificar colDef(show = FALSE)
para cada coluna que não desejo exibir na saída final. Como tenho certeza de que você pode entender, ter que repetir essas etapas para muito mais colunas parece exagero.
reactable(ex,
highlight = TRUE,
pagination = FALSE,
defaultColDef = colDef(
align = "center",
headerVAlign = "center",
html = TRUE
),
columns = list(
date = colDef(sticky = "left"),
var1 = colDef(cell = pill_buttons(ex, color_ref = "var1_z_pal")),
var2 = colDef(cell = pill_buttons(ex, color_ref = "var2_z_pal")),
var3 = colDef(cell = pill_buttons(ex, color_ref = "var3_z_pal")),
var1_z = colDef(show = FALSE),
var2_z = colDef(show = FALSE),
var3_z = colDef(show = FALSE),
var1_z_pal = colDef(show = FALSE),
var2_z_pal = colDef(show = FALSE),
var3_z_pal = colDef(show = FALSE)
)
)
Sei que posso usar outros pacotes de tabela, como kableExtra
esse, que podem simplificar meu fluxo de trabalho, mas estou decidido a usar reactablefmtr
e a pill_buttons()
função, pois gosto da estética. Espero que alguém tenha uma solução onde eu possa tornar meu código para criar a saída desejada mais eficiente sem ter que escrever muitas, muitas linhas.
Aqui está um exemplo em que every
colDef(show = FALSE)
e everycolDef(cell = pill_buttons(...))
são gerados dinamicamente sem escrevê-los para cada coluna relevante. Isso pode ser estendido para um número arbitrário de colunas.Usamos
lapply
aqui para gerar uma lista contendo os diferentescolDef
e, adicionalmente, nomear essas entradas da lista de modo que correspondam aos nomes das colunas relevantes.Resultado:
Dados: