使用checkboxGroupInput呈现多个uiOutputs

时间:2017-08-22 17:18:44

标签: r shiny

有没有办法在闪亮的应用中使用checkboxGroupInput来渲染多个uiOutputs:

server <- function(input, output) {

  output$control1 <- renderUI({
    req(input$devs)
    if(input$devs %in% c("A")){
      selectInput("a", "control A", choices = c("a", "b"))
    }
  })

  output$control2 <- renderUI({
    req(input$devs)
    print(input$devs)
    if(input$devs %in% c("B")){
      selectInput("b", "controlB", choices = c("c", "d"))
    }
  }) 

}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("devs", "Select controls", choices = c("A", "B")),
      uiOutput("control1"),
      uiOutput("control2")
    ),
    mainPanel()
  )
)

shinyApp(ui = ui, server = server)

我已经阅读了一些线程,解释了如何在同一个uiOutput中呈现multiple widgets但是要清楚我希望使用一个输入呈现多个uiOutput。我知道我可以将输入分成多个checkboxInputs,但我不想这样做。原因是我将checkboxGroupInput选项作为参数传递给markdown report,并希望将选择保留为一个ID(真正的应用程序有很多输入)。

1 个答案:

答案 0 :(得分:1)

我认为你只需要对if语句进行一些小改动。 input$devs %in% "B"将返回FALSE TRUE,这将触发if语句中的代码。

您只需将其更改为: "B" %in% input$devs

以下完整代码:

server <- function(input, output) {

  output$control1 <- renderUI({
    req(input$devs)
    if("A" %in% input$devs){
      selectInput("a", "control A", choices = c("a", "b"))
    }
  })

  output$control2 <- renderUI({
    req(input$devs)
    if("B" %in% input$devs){
      selectInput("b", "controlB", choices = c("c", "d"))
    }
  }) 

}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("devs", "Select controls", choices = c("A", "B")),
      uiOutput("control1"),
      uiOutput("control2")
    ),
    mainPanel()
  )
)

shinyApp(ui = ui, server = server)

请注意,您还可以将renderUI聚合为sthg,如:

choices - list()
choices[["A"]] <- c("a", "b")
choices[["B"]] <- c("c", "d")

observe({
   lapply(input$devs, function(letter){ 
      output[[paste0("control", letter) <- renderUI({
        if(letter %in% input$devs){
          selectInput(letter, paste0("control", letter), choices = choices[[letter]])
        }
      })
   }
})