在 R shiny 中,如何通过单击 selectInput 对象中的特定选择来触发模式对话框?

In R shiny, how to trigger a modal dialog by clicking on a specific selection in a selectInput object?

底部的图片最能解释我的查询。

当 运行 下面的 MWE 代码时,我想将 numericInput for id = "rows" (侧边栏面板中的最后一个用户输入)移动到模式对话框中,由用户在 selectInput 中为 id =“selectData”选择“详细数据”选项(侧边栏面板中的第二个用户输入)。

知道怎么做吗?

我的一个尝试在下面被注释掉了。 运行 它没有注释(并且 UI 部分 numericInput("rows",... 中的行被注释掉了),你会看到模式对话框是如何在没有点击任何东西的情况下弹出的。

当用户单击“详细数据”选项时,该模式对话框应有条件地呈现。

MWE 代码:

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"),
        numericInput("rows", "Rows of data to pull from text file:", 20, min = 1, max = 100),
      ),
      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 == 'Detail data'",{
  #   showModal(
  #     modalDialog(
  #       numericInput("rows", "Rows of data to pull from text file:", 20, min = 1, max = 100),
  #       footer = modalButton("Close")
  #     ))
  # })
  
   output$table <- renderDT(datatable(iris, options = list(pageLength = 15)))
    
}

shinyApp(ui, server)

你的问题的关键部分似乎是如何在使用 selectInput 时获得模式对话。出于这个原因,我删除了你问题中包含的大部分额外代码,下面的代码应该符合你的需要:

library(shiny)

ui <- fluidPage(
        selectInput("selectData", h5(strong("Select data to view:")), 
                    choices = list("Summary", "Detail data"), selected = "Summary")
  ) 

server <- function(input, output, session) {
  
  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")
        ))
    }
  })
}

shinyApp(ui, server)

对于 observeEvent,我将其更改为专门查看输入 selectData。然后我做了一个简单的if语句,如果输入是“Detail data”,就弹出模态对话框。