首页 > 解决方案 > 是否可以在禁用和启用 DT 表之间切换?

问题描述

我有一个应用程序,它有一个启用了行选择的 DT 表。是否可以在不重新渲染的情况下在禁用和启用整个表格之间切换?使用shinyjs::disableandshinyjs::enable将禁用和启用表格中用于过滤的文本框,但不能选择行。我也不知道有任何 DT 代理方法可以完成我正在尝试做的事情。

library(shiny)
library(DT)
library(shinyjs)

ui <- fluidPage(
  DTOutput("table"),
  actionButton(inputId = "disable",
               label = "Disable"),
  actionButton(inputId = "enable",
               label = "Enable"),
  useShinyjs()
)

server <- function(input, output, session) {

  output$table <- renderDT({
    data <- data.frame(COL_1 = c(1, 2, 3, 4),
                       COL_2 = c("A", "B", "C", "D"),
                       stringsAsFactors = FALSE)
    datatable(data,
              escape = FALSE,
              filter = list(position = "top"),
              rownames = FALSE)
  })


  observeEvent(input$disable, {
    disable(id = "table")
  })

  observeEvent(input$enable, {
    enable(id = "table")
  })

}

shinyApp(ui = ui, server = server)

标签: rshinydtshinyjs

解决方案


似乎没有适合您需求的代理方法,因此您必须重新渲染表格。

但是,您不需要library(shinyjs).

请检查以下内容:

library(shiny)
library(DT)

ui <- fluidPage(
  DTOutput("table"),
  actionButton(inputId = "disable",
               label = "Disable"),
  actionButton(inputId = "enable",
               label = "Enable")
)

server <- function(input, output, session) {

  dtSettings <- reactiveValues(searchable = TRUE, mode = "multiple")

  output$table <- renderDT({
    data <- data.frame(COL_1 = c(1, 2, 3, 4),
                       COL_2 = c("A", "B", "C", "D"),
                       stringsAsFactors = FALSE)
    datatable(data,
              escape = FALSE,
              filter = list(position = "top"),
              rownames = FALSE,
              selection = list(mode = dtSettings$mode , selected = NULL, target = 'row'),
              options = list(
                columnDefs = list(list(targets = seq_len(ncol(data))-1, searchable = dtSettings$searchable)),
                pageLength = 5
              ))
  }, server = FALSE)

  observeEvent(input$disable, {
    dtSettings$searchable <- FALSE
    dtSettings$mode <- "none"
  })

  observeEvent(input$enable, {
    dtSettings$searchable <- TRUE
    dtSettings$mode <- "multiple"
  })
}

shinyApp(ui = ui, server = server)

推荐阅读