闪亮的应用程序checkboxInput和conditionalPanel

时间:2015-12-06 07:21:27

标签: r shiny

我是ShinyApp的新手。

我想使用带有conditionalPanel的checkboxInput(),所以当它被选中时,会显示Type的选项(然后用户可以从“BEER”,“REFRESHMENT”,“SPIRITS”,“WINE”中选择一个Type) 。如果未选中,则不会显示“类型”选项。

下面是我的代码,但是当Type选项没有显示时,无论我是否选中该框。我想我应该在服务器功能中写一些东西?我真的不知道。谢谢你的帮助。

  ui <- fluidPage(
        titlePanel("BC Liquor Store prices"),
        img(src = "BCLS.png",align = "right"),
        sidebarLayout(
             sidebarPanel(sliderInput("priceInput", "Price", 0, 100, c(25, 40), pre = "$"),

            wellPanel(
            checkboxInput("checkbox", "Filter by Type", FALSE),
            conditionalPanel(
              condition="checkbox==true",   
             selectInput("typeInput", "Product type",
                          choices = c("BEER", "REFRESHMENT", "SPIRITS", "WINE"),
                          selected = "WINE")
          )
        ),

             uiOutput("countryOutput")

),
mainPanel(
  tabsetPanel(
    tabPanel("Plot", plotOutput("coolplot")), 
    tabPanel("Summary", verbatimTextOutput("summary")), 
    tabPanel("Table", tableOutput("results"))
   )
  )
 )
)

server <- function(input, output, session) {
      output$countryOutput <- renderUI({
      selectInput("countryInput", "Country",
            sort(unique(bcl$Country)),
            selected = "CANADA")
  })  

     filtered <- reactive({
        if (is.null(input$countryInput)) {
        return(NULL)
}    

bcl %>%
  filter(Price >= input$priceInput[1],
         Price <= input$priceInput[2],
         Type == input$typeInput,
         Country == input$countryInput
  )
})

     output$coolplot <- renderPlot({
         if (is.null(filtered())) {
         return()
      }
     filtered() %>% ggvis(~Alcohol_Content, fill := "#fff8dc") %>% 
        layer_histograms(width = 1, center = 0)
   })

 output$results <- renderTable({
filtered()
 })
}

2 个答案:

答案 0 :(得分:5)

好的,您可以将条件输入分为两类。

1)依赖于ui.R的输入(在您的情况下为checkboxInput)

2)依赖于server.R的输入(在您的示例中不必要)

解决方案:

1)您可以使用renderUI()函数轻松解决,请参阅下面的示例。

如果你真的想要2),你需要一个conditionalPanel,你可以在server.R中使用一个被动函数,你保存在一个输出对象中,并用ui.R中的小JS片段访问它。对我来说,它看起来像1)对你来说已经足够了,如果我弄错了,请让我知道然后我们调整答案来解决2)。

提示:

默认情况下,“checkbox”输入采用布尔值:false。所以你不会渲染“typeInput”(直到你点击“复选框”)。所以直到那一点“typeInput”为空。 但是,如果你现在依赖“typeInput”闪亮会被混淆, 因为“typeInput”未呈现,因此不存在。 所以在使用“typeInput”之前,你应该检查它是否可用: if(!is.null(input$typeInput))否则闪亮会抱怨你的应用中实际上没有“typeinput”(再次:至少在你点击“复选框”之前)。

ui <- fluidPage(
  titlePanel("BC Liquor Store prices"),
  img(src = "BCLS.png",align = "right"),
  sidebarLayout(
    sidebarPanel(sliderInput("priceInput", "Price", 0, 100, c(25, 40), pre = "$"),

                 wellPanel(
                   checkboxInput("checkbox", "Filter by Type", FALSE),
                   uiOutput("conditionalInput")
                 ),

                 uiOutput("countryOutput")

    ),
    mainPanel(
      tabsetPanel(
        tabPanel("Plot", plotOutput("coolplot")), 
        tabPanel("Summary", verbatimTextOutput("summary")), 
        tabPanel("Table", tableOutput("results"))
      )
    )
  )
)

server <- function(input, output, session) {
  output$countryOutput <- renderUI({
    selectInput("countryInput", "Country",
                sort(unique(bcl$Country)),
                selected = "CANADA")
  })  

  output$conditionalInput <- renderUI({
    if(input$checkbox){
      selectInput("typeInput", "Product type",
                  choices = c("BEER", "REFRESHMENT", "SPIRITS", "WINE"),
                  selected = "WINE")
    }
  })

  filtered <- reactive({
    if (is.null(input$countryInput)) {
      return(NULL)
    }    

    bcl %>%
      filter(Price >= input$priceInput[1],
             Price <= input$priceInput[2],
             Type == input$typeInput,
             Country == input$countryInput
      )
  })

  output$coolplot <- renderPlot({
    if (is.null(filtered())) {
      return()
    }
    filtered() %>% ggvis(~Alcohol_Content, fill := "#fff8dc") %>% 
      layer_histograms(width = 1, center = 0)
  })

  output$results <- renderTable({
    filtered()
  })
}

# run the app
shinyApp(ui = ui, server = server)

答案 1 :(得分:2)

我最近在研究类似的one时遇到了这个问题。

似乎对checkboxInput条件的简单回答如下:

condition="input.checkbox==1",