Shiny应用中shinyjs在observeEvent内无法执行全部操作的问题
问题原因
你的代码里updateSelectInput是异步操作,它不会立刻修改server端的input$selector值,要等当前的observeEvent执行完毕、进入下一个反应周期才会生效。而你紧接着调用shinyjs::click("generate")时,input$selector还是旧值,导致reactive对象data()取到的不是重置后的1对应的数据。
解决方案
在shinyjs::click之前调用session$flushReact(),强制Shiny立即刷新反应式值,让input$selector的更新提前生效。
修改后的完整代码:
library(shiny) library(dplyr) ui <- fluidPage( shinyjs::useShinyjs(), selectInput("selector", label = "Carb selector", choices = unique(mtcars$carb)), actionButton("generate", "OK!"), tableOutput("results"), actionButton("reset", "RESET"), ) server <- function(input, output, session) { data <- reactive({ req(input$generate) isolate( mtcars %>% filter(carb == input$selector) ) }) output$results <- renderTable(data()) observeEvent(input$reset, { updateSelectInput(session, inputId = "selector", label = "Carb selector updated", choices = unique(mtcars$carb), selected = 1) session$flushReact() shinyjs::click("generate") }) } shinyApp(ui, server)
补充说明:原代码使用了%>%管道符,需要提前加载dplyr包,否则会出现函数未定义的错误。
内容的提问来源于stack exchange,提问作者David Jorquera
相关产品推荐
相关产品推荐

