Вот решение.
По сути, я использовал этот код для создания функции, которая создает диапазон цветов (помещается перед ui
, поскольку он должен запускаться только один раз и не требует перезагрузки с помощью входные данные):
# General function
colfunc <- colorRampPalette(c("blue", "deepskyblue"))
Затем, поскольку ваши данные представляли собой матрицу, я преобразовал их в кадр данных, а затем не обработал столбцы, чтобы получить их в цифрах c (благодаря функции unfactor
, из пакета varhandle
):
bytopic <- as.data.frame(bytopic)
bytopic <- unfactor(bytopic)
Наконец, я использовал эти примеры , чтобы раскрасить столбцы в соответствии с их значениями (только столбец year
в блоке ниже):
formatStyle("year",
backgroundColor = styleEqual(sort(unique(bytopic$year),
decreasing = TRUE),
colfunc(length(unique(bytopic$year)))
)
)
Проблема в том, что я не могу поместить этот кусок в функцию (возможно, это легко сделать, но мне это не удалось), поэтому вам придется повторять этот код для каждого столбца, который вы хочу раскрасить (надеюсь, у вас их немного). Это не идеально, но, по крайней мере, это рабочая основа.
Вот полный код:
# --------------------------------------- Global --------------------------------------- #
#1. App
if("shiny" %in% rownames(installed.packages()) == FALSE){ install.packages("shiny") }
library(shiny)
#3. Easier data handling
if("dplyr" %in% rownames(installed.packages()) == FALSE){ install.packages("dplyr") }
library(dplyr)
#8. Data Table shiny outputs
if("DT" %in% rownames(installed.packages()) == FALSE){ install.packages("DT") }
library(DT)
# General function
colfunc <- colorRampPalette(c("blue", "deepskyblue"))
# Additional package
if("varhandle" %in% rownames(installed.packages()) == FALSE){ install.packages("varhandle") }
library(varhandle)
#--------------------------------------- User Interface ---------------------------------------#
ui <- fluidPage(
DT::dataTableOutput("topic_info_table")
)
#--------------------------------------- Server ---------------------------------------#
server <- function(input, output, session) {
# COLOR TABLE BY TOPIC
bytopic <- NULL
output$topic_info_table <- DT::renderDataTable({
bytopic <- structure(c("Chocolate", "Pineapple", "Coconut", "Jam", "Jelly",
"Soup", "Ice-Cream", "Cake", "Pudin", "Candy", "Pizza", "Rum",
"Vodka", "2016", "2016", "2017", "2016", "2016", "2018", "2016",
"2017", "2016", "2016", "2016", "2017", "2017", "2034", "2036",
"2036", "2029", "2035", "2036", "2035", "2033", "2035", "2035",
"2035", "2034", "2037", "14030.57", "13488.00", "12402.98", "16053.32",
"13256.43", "11388.83", "12005.04", "13691.61", "13161.59", "12605.35",
"12348.48", "12872.83", "10963.04"), .Dim = c(13L, 4L), .Dimnames = list(
c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",
"12", "13"), c("topic", "year", "expiration", "cost")))
bytopic <- as.data.frame(bytopic)
bytopic <- unfactor(bytopic)
DT::datatable(bytopic, options = list(pageLength = 15)) %>%
formatCurrency(c('cost')) %>%
formatStyle("year",
backgroundColor = styleEqual(sort(unique(bytopic$year),
decreasing = TRUE),
colfunc(length(unique(bytopic$year)))
)
) %>%
formatStyle("expiration",
backgroundColor = styleEqual(sort(unique(bytopic$expiration),
decreasing = TRUE),
colfunc(length(unique(bytopic$expiration)))
)
) %>%
formatStyle("cost",
backgroundColor = styleEqual(sort(unique(bytopic$cost),
decreasing = TRUE),
colfunc(length(unique(bytopic$cost)))
)
)
})
}
shinyApp(ui,server)