Я использовал JavaScript для условного форматирования таблицы данных в Shiny, все работает хорошо. Однако при нажатии кнопки форматирование пропадает.
Воспроизводимый пример приведен ниже. Таблица отображается должным образом, однако при ее перерисовке (если вы выберете количество отображаемых строк или введете значение в поле поиска) форматирование исчезнет. Я бы хотел, чтобы это осталось.
library(shiny)
library(DT)
ui <- fluidPage(
mainPanel(
dataTableOutput("table1")
)
)
server <- function(input, output) {
js_format1 <- c(
"function(settings) {",
" var table = settings.oInstance.api();",
" var nrows = table.rows().count();",
" for(var i=0; i<nrows; i++){",
" var a = table.cell(i,2);",
" var b = table.cell(i,3);",
" b.node().style.backgroundColor = b.data() >= a.data() ? 'lightgreen' : '#FFCCCB';",
" }",
"}")
output$table1 <- renderDataTable({
dat <- data.frame(A = letters[1:10], a=rep(1,10), b = rep(2,10))
datatable(dat,
options = list(initComplete = JS(js_format1)))
})
}
# Run the application
shinyApp(ui = ui, server = server)
Вы должны использовать опцию drawCallback
вместо initComplete
.
Вот модифицированные коды:
library(shiny)
library(DT)
ui <- fluidPage(
mainPanel(
dataTableOutput("table1")
)
)
server <- function(input, output) {
js_format1 <- c(
"function(settings) {",
" var table = settings.oInstance.api();",
" var nrows = table.rows().count();",
" for(var i=0; i<nrows; i++){",
" var a = table.cell(i,2);",
" var b = table.cell(i,3);",
" b.node().style.backgroundColor = b.data() >= a.data() ? 'lightgreen' : '#FFCCCB';",
" }",
"}")
output$table1 <- renderDataTable({
dat <- data.frame(A = letters[1:10], a=rep(1,10), b = rep(2,10))
datatable(dat,
options = list(drawCallback = JS(js_format1)))
})
}
# Run the application
shinyApp(ui = ui, server = server)