是否可以在禁用和启用 DT table 之间切换?
Is it possible to toggle between disabling and enabling a DT table?
我有一个应用程序,它的 DT table 启用了行 selection。是否可以在不重新渲染的情况下在禁用和启用整个 table 之间切换?使用 shinyjs::disable
和 shinyjs::enable
将禁用和启用 table 中用于过滤的文本框,但不会 select 行。我也不知道有任何 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)
似乎没有 proxy method 符合您的需求,因此您必须重新渲染 table。
但是,您不需要 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)
我发现我可以通过在数据表的 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)
我有一个应用程序,它的 DT table 启用了行 selection。是否可以在不重新渲染的情况下在禁用和启用整个 table 之间切换?使用 shinyjs::disable
和 shinyjs::enable
将禁用和启用 table 中用于过滤的文本框,但不会 select 行。我也不知道有任何 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)
似乎没有 proxy method 符合您的需求,因此您必须重新渲染 table。
但是,您不需要 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)
我发现我可以通过在数据表的 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)