我的Shiny应用程序包含一个DT数据表,该数据表带有一个selectInput。第一次加载该表时,我可以在selectInput值发生变化时获得它。但是,当用户重新加载该表时,我不再能够获得更新后的selectInput值。一个解决方案是在每次重新加载表时重命名selectInput inputId,并跟踪inputId。('Reset inputs' button in shiny app),并希望类似的方法能起作用。在这里,我把我的DT数据表放在一个div中,它的id在每次重新加载表时都会更新。但是,它不起作用。在下面的示例中,用户通过单击“重新加载表”来重新加载表。在重新加载表后,input$id1
不再响应表中的下拉选择。除了在每次重新加载表时重命名selectinput inputId之外,还有其他建议吗?
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)))
}
})
}
)
1条答案
按热度按时间vc9ivgsu1#
在重新加载之前必须解除绑定。但是,我不知道为什么,还必须在
renderDT
中设置server = FALSE
: