Обновить динамически отображаемый пользовательский интерфейс в bsModal

#r #shiny #renderui

#r #блестящий #renderui

Вопрос:

Я хочу использовать 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» после второго щелчка.

Есть ли чистое решение для этого или, по крайней мере, обходной путь? Как я могу отобразить пользовательский интерфейс внутри модального при запуске?

Ответ №1:

Простое использование selectInput inside 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)