在 bsModal 中更新动态渲染 UI

Update dynamically rendered UI in bsModal

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

示例如下:

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- 每次单击按钮时,模态框内的输入都显示“B”。 当前行为:第一次点击后显示“A”(即初始值),第二次点击后显示“B”。

是否有干净的解决方案或至少有解决方法?如何在启动时在模态内渲染 UI?

只需在 observeEvent 中使用 selectInput 即可显示您预期的行为,如下所示。您的用例是否要求您使用 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)