在bsModal中更新动态呈现的UI

问题描述

我想使用bsModal,其中包含通过renderUI生成的输入。输入取决于我的数据,但启动后不会更改。打开模态时,我想更新输入的选定值。问题在于,在我的最小可重现示例中,由于尚未渲染模态内部的输入,因此第一次更新出错。从第二次更新开始,一切正常。

这里是示例:

library(shiny)
library(shinyBS) 

ui <- fluidPage(

    titlePanel("Modal Update Problem"),actionButton(inputId = "btn_test",label = "Click Me"),bsModal("modal_test","Test Modal","btn_test",size = "large",uIoUtput("test_ui")
    )
    
    
)

server <- function(input,output,session) {

    observeEvent(input$btn_test,{
        updateSelectInput(
            session = session,inputId = "test_select",selected = "B"
        )
    })
    
    output$test_ui <- renderUI({
        selectInput(
            inputId = "test_select",label = "Test",choices = c("A","B","C"),selected = "A"
        )
    })
}

# Run the application 
shinyApp(ui = ui,server = server)

预期的行为:每次我单击按钮时,模式内的Select-Input显示为“ B”。 当前行为:第一次点击后显示“ A”(即初始值),第二次点击后显示“ B”。

是否有一个干净的解决方案来做到这一点,或者至少是一种解决方法?如何在启动时在模式内部呈现UI?

解决方法

仅在selectInput中使用observeEvent即可显示预期的行为,如下所示。您的用例是否要求您使用updateSelectInput?如果是这样,您可以使用outputOptions,如下所示。

ui <- fluidPage(
  
  titlePanel("Modal Update Problem"),actionButton(inputId = "btn_test",label = "Click Me"),bsModal("modal_test","Test Modal","btn_test",size = "large",uiOutput("test_ui")
  )
)

server <- function(input,output,session) {
  
  observeEvent(input$btn_test,{
    updateSelectInput(
      session = session,inputId = "test_select",selected = "B"
    )
  })
  
  output$test_ui <- renderUI({
    selectInput(
      inputId = "test_select",label = "Test",choices = c("A","B","C"),selected = "A"
    )
  })
  outputOptions(output,"test_ui",suspendWhenHidden = FALSE) 
  
}

# Run the application 
shinyApp(ui = ui,server = server)