在 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)
我想使用包含通过 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)