styleEqual
отображает свои аргументы один-к-одному :
значения: вектор значений CSS
уровни: символьный вектор данныхзначения, которые должны быть сопоставлены (один к одному) со значениями CSS
Поэтому вы можете
df <- data.frame(cat = letters[1:5],
t1 = c(33, NA, 89, 45, NA),
t2 = c(NA, NA, 4, NA, 23),
t3 = c(56, NA, NA, 67, NA),
t4 = c(NA, NA, 12, 66, NA))
uval <- unique(df[!is.na(df)])
datatable(df) %>%
formatStyle(names(df)[-1],
backgroundColor = styleEqual(c(NA, uval),
c('red', rep('lightgreen', length(uval)))))
сопоставить каждое значение одному и тому же цвету.
![enter image description here](https://i.stack.imgur.com/vN3U6m.png)
Другой вариант - реализовать его вручную с помощью JavaScript:
library(shiny)
library(htmlwidgets)
js <- 'function(settings, json) {
// For every row, select all table cells starting at cell #3
$("#DataTables_Table_0 td:nth-child(3+1n)").each(function(key, val) {
if( $(this).html() == "") {
$(this).css("background-color", "#f00");
} else {
$(this).css("background-color", "#0f0");
};
});
}'
ui <- fluidPage(fluidRow(dataTableOutput("main_temp")))
server <- function(input, output) {
df <- data.frame(cat = letters[1:5],
t1 = c(33, NA, 89, 45, NA),
t2 = c(NA, NA, 4, NA, 23),
t3 = c(56, NA, NA, 67, NA),
t4 = c(NA, NA, 12, 66, NA))
// when the table has finished loading, execute the JS code
output$main_temp <- renderDataTable(df, options = list(initComplete = JS(js)))
}
shinyApp(ui = ui, server = server)