在R Shiny中如何点击selectInput特定选项触发模态对话框
你之前的代码出现模态框自动弹出的问题,核心是observeEvent的触发参数写法错误:你传入了字符串形式的判断条件,而非Shiny要求的响应式触发源,静态字符串会被识别为恒有效触发条件,再加上没有忽略初始化事件,才会导致页面加载即弹窗。
修改步骤
- 第一步:注释/删除UI部分sidebarPanel中的
numericInput("rows", "Rows of data to pull from text file:", 20, min = 1, max = 100)代码行 - 第二步:将server中注释的observeEvent代码替换为如下正确写法:
observeEvent(input$selectData, { # 仅当选中Detail data时弹出模态框 if (input$selectData == "Detail data") { showModal( modalDialog( numericInput("rows", "Rows of data to pull from text file:", 20, min = 1, max = 100), footer = modalButton("Close") ) ) } }, ignoreInit = TRUE)
这里加ignoreInit = TRUE是为了跳过页面初始化时的首次触发,避免刚加载页面就弹出模态框。
修改后完整可运行代码
library(shiny) library(DT) ui <- fluidPage( titlePanel("Public data library"), sidebarLayout( sidebarPanel( selectInput("selectProgram", h5(strong("Select program:")), choices = list("Beta", "Other"), selected = "Beta"), selectInput("selectData", h5(strong("Select data to view:")), choices = list("Summary", "Detail data"), selected = "Summary") # 已删除原侧边栏rows输入组件 ), mainPanel( tabsetPanel( tabPanel("Public data", value = 1, div(style = "margin-top:15px; margin-bottom:5px"), conditionalPanel(condition = "input.selectProgram == 'Beta'", h4(strong(textOutput("program1",inline = TRUE)," >> ", textOutput("data1",inline=TRUE))), conditionalPanel(condition = "input.selectData == 'Detail data'", DTOutput("table") ) ), conditionalPanel(condition = "input.selectProgram == 'Other'", h4(strong(textOutput("program2",inline = TRUE)," >> ", textOutput("data2",inline=TRUE))), conditionalPanel(condition = "input.selectData == 'Detail data'" ) ), ), id = "tabselected" ) ) ) ) server <- function(input, output, session) { output$program1 <- renderText({input$selectProgram}) output$program2 <- renderText({input$selectProgram}) output$data1 <- renderText({input$selectData}) output$data2 <- renderText({input$selectData}) # 修正后的模态框触发逻辑 observeEvent(input$selectData, { if (input$selectData == "Detail data") { showModal( modalDialog( numericInput("rows", "Rows of data to pull from text file:", 20, min = 1, max = 100), footer = modalButton("Close") ) ) } }, ignoreInit = TRUE) output$table <- renderDT(datatable(iris, options = list(pageLength = 15))) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

