#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)