r语言 - 重新加载表后,闪亮的DT数据表输入反应性



我的Shiny应用程序包含一个带有selectInput的DT数据表。第一次加载表时,我可以在它改变时获得selectInput值。但是,当用户重新加载表时,我不再能够获得更新的selectInput值。一种解决方案是在每次重新加载表时将selectInput重命名为inputId,并跟踪inputId。我偶然发现了这篇文章('Reset input '按钮),并希望类似的方法能够奏效。这里,我将DT数据表放在一个div中,该div的id在每次重新加载表时更新。然而,它不起作用。在下面的示例中,用户通过单击"Reload table"重新加载表。重新加载表后,input$id1不再响应表中的下拉选择。除了每次重新加载表时重命名selectinputinputid之外,还有什么建议吗?

require(shiny)
require(DT)
shinyApp(
ui = fluidPage(
actionButton(inputId = "reload", label = "Reload table"),
uiOutput("resettable_table")
),
server = function(input, output, session) {
rv <- reactiveValues(times = 1)
observeEvent(input$reload, {
rv$times <- rv$times + 1
})
output$mytable <- DT::renderDataTable({
input$reload
DT::datatable(
data = data.frame(
Col1 = as.character(selectInput(
inputId = "id1",
label = NULL,
choices = letters
))
),
escape = F,
selection = "none",
options = list(
preDrawCallback = JS('function(){Shiny.unbindAll(this.api().table().node());}'),
drawCallback = JS('function(){Shiny.bindAll(this.api().table().node());}')
)
)
})

output$resettable_table <- renderUI({
req(rv$times)
div(
id = paste0("mydiv", rv$times),
DT::dataTableOutput("mytable")
)
})

observe({
if(is.null(input$id1)) {
print("input$id1 is NULL")
} else {
print(paste(c("input$id1:", input$id1)))
}
})
}
)

必须在重新加载之前解除绑定。但是,我不知道为什么,还必须在renderDT中设置server = FALSE:

shinyApp(
ui = fluidPage(
tags$head(tags$script(
HTML(
"Shiny.addCustomMessageHandler('unbindDT', function(id) {
var $table = $('#'+id).find('table');
if($table.length > 0){
Shiny.unbindAll($table.DataTable().table().node());
}
})")
)),
actionButton(inputId = "reload", label = "Reload table"),
uiOutput("resettable_table")
),
server = function(input, output, session) {
rv <- reactiveValues(times = 1)

observeEvent(input$reload, {
session$sendCustomMessage("unbindDT", "mytable")
rv$times <- rv$times + 1
})

output$mytable <- DT::renderDataTable({
input$reload
DT::datatable(
data = data.frame(
Col1 = as.character(selectInput(
inputId = "id1",
label = NULL,
choices = letters,
selectize = FALSE
))
),
escape = F,
selection = "none",
options = list(
preDrawCallback = JS('function(){Shiny.unbindAll(this.api().table().node());}'),
drawCallback = JS('function(){Shiny.bindAll(this.api().table().node());}')
)
)
}, server = FALSE)

output$resettable_table <- renderUI({
req(rv$times)
div(
id = paste0("mydiv", rv$times),
DT::dataTableOutput("mytable")
)
})

observe({
if(is.null(input$id1)) {
print("input$id1 is NULL")
} else {
print(paste(c("input$id1:", input$id1)))
}
})
}
)

最新更新