Estoy teniendo dificultades para convertir mi columna de pie de página en un reactivo. Quiero usar JS aquí para acceder al estado filtrado del lado del cliente, y como no estoy muy familiarizado con JS, estoy atascado. Lo que quiero es: usar los valores de pie de página resumidos de dos columnas para crear un valor de pie de página resumido para una tercera columna. Vea el ejemplo a continuación.
library(shiny) library(tidyverse) data = tibble(article =c("a", "b", "c"), sales = c(12,34,16), margin = c(6,20,9)) %>% mutate(profit = round(margin / sales * 100, digits = 2)) ui = fluidPage( div(style = "margin-top: 50px; display: flex; justify-content: center;", reactableOutput(outputId = "table")) ) server = function(input, output, session){ output$table = renderReactable({ reactable( data = data, columns = list( article = colDef( footer = "..."), sales = colDef( format = colFormat(suffix = "€"), footer = JS("function(colInfo) { var total = 0 colInfo.data.forEach(function(row) { total += row[colInfo.column.id] }) return total.toFixed(2) + '€'}")), margin = colDef( format = colFormat(suffix = "€"), footer = JS("function(colInfo) { var total = 0 colInfo.data.forEach(function(row) { total += row[colInfo.column.id] }) return total.toFixed(2) + '€'}")), profit = colDef( format = colFormat(suffix = "%"), footer = "35/62*100" ) )) }) } shinyApp(ui, server)Solución del revelador reactable aquí
Aquí hay un ejemplo de una función de representación de pie de página que usa
colInfo.data. Es como el ejemplo de la función agregada personalizada en los documentos, exceptocolInfo.datatoma el lugar de lasrows.
library(reactable) library(dplyr) set.seed(10) data <- sample_n(MASS::Cars93[23:40, ], 30, replace = TRUE) %>% mutate(Price = Price * 3, Units = sample(1:5, 30, replace = TRUE)) %>% mutate(Avg.Price = Price / Units) %>% select(Model, Manufacturer, Price, Units, Avg.Price) reactable( data, groupBy = "Manufacturer", columns = list( Price = colDef(aggregate = "sum"), Units = colDef(aggregate = "sum"), Avg.Price = colDef( # Calculate the aggregate Avg.Price as `sum(Price) / sum(Units)` footer = JS("function(colInfo) { let totalPrice = 0 let totalUnits = 0 colInfo.data.forEach(function(row) { totalPrice += row['Price'] totalUnits += row['Units'] }) return (totalPrice / totalUnits).toFixed(2) }") ) ) )