Shiny DT表格重载后selectInput输入响应失效的解决方案咨询
Shiny DT表格重载后selectInput无法响应的解决方案
当DT表格重载后,原selectInput的inputId绑定会失效,导致无法获取更新值。不用每次重命名inputId的解决思路如下:
核心问题是重载表格时,旧的selectInput元素未被正确解绑,新元素的绑定与旧实例冲突。可以通过服务器端显式清理旧input绑定,配合DT的回调函数确保新元素正确绑定。
修改后的代码示例
require(shiny) require(DT) shinyApp( ui = fluidPage( actionButton(inputId = "reload", label = "Reload table"), DT::dataTableOutput("mytable") ), server = function(input, output, session) { rv <- reactiveValues(times = 1) observeEvent(input$reload, { rv$times <- rv$times + 1 # 清理旧的input绑定,避免新旧实例冲突 session$removeInput("id1") }) output$mytable <- DT::renderDataTable({ req(rv$times) DT::datatable( data = data.frame( Col1 = as.character(selectInput( inputId = "id1", label = NULL, choices = letters )) ), escape = FALSE, selection = "none", options = list( preDrawCallback = JS('function(){Shiny.unbindAll(this.api().table().node());}'), drawCallback = JS('function(){Shiny.bindAll(this.api().table().node());}') ) ) }) observe({ if(is.null(input$id1)) { print("input$id1 is NULL") } else { print(paste(c("input$id1:", input$id1))) } }) } )
关键修改说明
- 移除了动态生成的外层div,无需通过div ID重置,直接清理input绑定即可。
- 点击重载按钮时调用
session$removeInput("id1"),强制Shiny移除旧的id1输入绑定,让新渲染的selectInput能重新绑定到input$id1。 - 用
req(rv$times)作为表格渲染的依赖,确保每次重载次数变化时触发表格重新渲染。
内容的提问来源于stack exchange,提问作者Ben Ernest
相关产品推荐
相关产品推荐

