【问题标题】:Is it possible to toggle between disabling and enabling a DT table?是否可以在禁用和启用 DT 表之间切换?
【发布时间】:2020-09-04 17:47:22
【问题描述】:

我有一个应用程序,它有一个启用了行选择的 DT 表。是否可以在不重新渲染的情况下在禁用和启用整个表格之间切换?使用shinyjs::disable 和shinyjs::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)

【问题讨论】:

    标签: r shiny dt shinyjs


    【解决方案1】:

    似乎没有适合您需求的proxy method,因此您必须重新渲染您的表格。

    但是,您不需要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)
    

    【讨论】:

    • 感谢您发布解决方案。对于我的特定工作流程,我无法重新渲染表格。但是,我最终弄清楚了如何使用 javascript 来做到这一点。请参阅我发布的解决方案。
    【解决方案2】:

    我发现我可以通过在数据表的 tbody 元素中使用 event.stopPropagation() 来完成此操作。

    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, {
        runjs("document.getElementById('table').getElementsByTagName('tbody')[0].setAttribute('onmousedown', 'event.stopPropagation();');")
      })
    
      observeEvent(input$enable, {
        runjs("document.getElementById('table').getElementsByTagName('tbody')[0].removeAttribute('onmousedown');")
      })
    
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      相关资源
      最近更新 更多