问题描述
我想使用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?
解决方法
仅在selectInput
中使用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)