Можно ли изменить цвет фона выбранных пользователем ячеек в таблице DT приложения Shiny на основе программных правил и реактивных ценностей?
Я могу настроить цвет выбранных пользователем ячеек ВСЕ с помощью tags$style
в приведенном ниже коде. Тем не менее, я хотел бы, чтобы таблица была «Когда пользователь выбирает ячейку, измените цвет фона этой ячейки на белый в нечетных строках или синий в четных строках - если значение ячейки выше не равно« X », тогда вообще не меняй». (на самом деле для этого есть причина!) Конечно, фрейм данных будет меняться в зависимости от ввода пользователя, но эти вводы не включены сюда для экономии места.
library(shiny)
library(DT)
ui <- fluidPage(
titlePanel("Sample app"),
tags$style(HTML('table.dataTable td.selected {background-color: blue !important;}')),
fluidRow(
column(width = 10,
DTOutput("maintable")
) ) )
server <- function(input, output, session) {
mydf <- reactive({data.frame(
matrix(" ", nrow = 10, ncol = 10, dimnames = list(
seq.int(1,10,1),
seq.int(1,10,1))
))
})
output$maintable <- renderDT(
DT::datatable(mydf(), selection = list(target = 'cell'), class = 'table-bordered compact', options = list(
dom='t',ordering=F, pageLength = nrow(mydf)
)))
}
shinyApp(ui = ui, server = server)
Первая часть — выделение цвета по нечетной/четной строке — я воспользовался классом «полосы» и добавил дополнительный CSS для удаления полос, но он включает дополнительный класс, чтобы сказать, является ли строка четной или нечетной. который помогает выбрать разные цвета.
Для if cell = "X"
я добавил несколько фиктивных столбцов для ссылки на добавление в класс «без выделения», чтобы при нажатии на него не менялся цвет.
/* Removes background colour of stripes */
table.dataTable.stripe tbody tr.odd, table.dataTable.stripe tbody tr.even {
background-color: #cccccc;
}
table.dataTable tr.odd td.selected:not(.no-highlight) {
background-color: #ffffff !important;
}
table.dataTable tr.even td.selected:not(.no-highlight) {
background-color: blue !important;
}
table.dataTable tbody tr td.selected.no-highlight {
background-color: #cccccc !important;
}
library(shiny)
library(DT)
ui <- fluidPage(
titlePanel("Sample app"),
tags$link(href = "style.css", rel = "stylesheet"),
fluidRow(
column(
width = 10,
DTOutput("maintable")
)
)
)
server <- function(input, output, session) {
mydf <- reactive(
data.frame(
matrix(
sample(c("X", " "), 100, TRUE),
nrow = 10,
ncol = 10,
dimnames = list(
seq.int(1, 10, 1),
seq.int(1, 10, 1)
)
)
)
)
trans_df <- reactive(
cbind(
mydf(),
rbind(" ", mydf()[seq(1, nrow(mydf()) - 1), ])
)
)
output$maintable <- renderDT(
DT::datatable(
trans_df(),
selection = list(target = "cell"),
class = "table-bordered compact stripe",
options = list(
dom = "t",
ordering = FALSE,
pageLength = nrow(mydf()),
columnDefs = list(
list(
targets = seq(ncol(mydf())) + ncol(mydf()),
visible = FALSE
),
list(
targets = seq(ncol(mydf())),
createdCell = JS(paste0(
"function (td, cellData, rowData, row, col) {",
"if (rowData[col + ", ncol(mydf()), "] === 'X') {",
"$(td).addClass('no-highlight');",
"}",
"}"
))
)
)
)
)
)
}
shinyApp(ui = ui, server = server)
Ой, я ошибся с тегом link
! Если вы измените src
на href
, это должно работать
Большое спасибо за это. К сожалению, когда я копирую и запускаю весь этот код на своем компьютере, включая style.css в www, цвета у меня не отображаются. (Я не могу добавить скриншот в свой комментарий, но я все еще вижу цвета по умолчанию.)