首页 > 解决方案 > 在 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?

标签: rshinyrenderui

解决方案


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

推荐阅读