2015-10-12 15 views
7

Ho due selectInput s e desidero la selezione nel primo (Marchio) per modificare le selezioni possibili nella seconda (Candy). Ad esempio, se qualcuno sceglie "Nestlé" nella prima casella di input, solo le barre di caramelle Nestle verranno visualizzate nella seconda casella. La mia tabella di dati ha una colonna per Marca e una colonna per il tipo di barra di Candy.Filter one selectInput in base alla selezione da un altro selectInput?

Ho il seguente codice per iniziare, ma questo mostra TUTTE le scelte, indipendentemente dalla selezione.

selectInput(inputId="brand", 
        label="Brand:", 
        choices=as.character 
        (unique(candyData$Brand)), 
        selected = "Nestle" 
    ), 
    selectInput(inputId="candy", 
       label="Candy:", 
       choices=as.character 
       (unique(candyData$Candy)), 
       selected = "100Grand" 

Il set di dati è simile al seguente:

Brand  Candy 
Nestle  100Grand 
Netle  Butterfinger 
Nestle  Crunch 
Hershey's KitKat 
Hershey's Reeses 
Hershey's Mounds 
Mars  Snickers 
Mars  Twix 
Mars  M&Ms 

Aggiornato Domanda Come posso aggiornare il ValueBox nella mia Dashboard basato sul successivo filtraggio?

output$count <- renderValueBox({ 

    valueBox(
     value = nrow(candyData), 
     subtitle = "Number of Candy Bars", 
     icon = icon("table") 
    ) 
    }) 
+0

Si prega di includere il set di dati 'candyData' e il resto del codice per la propria applicazione. – nrussell

+0

nrussell, è stato mostrato il set di dati di esempio. – Gary

risposta

10

Ecco uno approccio:

library(shiny) 
library(shinydashboard) 
## 
ui <- shinyUI({ 
    sidebarPanel(

    htmlOutput("brand_selector"), 
    htmlOutput("candy_selector")) 

}) 
## 
server <- shinyServer(function(input, output) { 
    candyData <- read.table(
    text = "Brand  Candy 
    Nestle  100Grand 
    Netle  Butterfinger 
    Nestle  Crunch 
    Hershey's KitKat 
    Hershey's Reeses 
    Hershey's Mounds 
    Mars  Snickers 
    Mars  Twix 
    Mars  M&Ms", 
    header = TRUE, 
    stringsAsFactors = FALSE) 

    output$brand_selector <- renderUI({ 

    selectInput(
     inputId = "brand", 
     label = "Brand:", 
     choices = as.character(unique(candyData$Brand)), 
     selected = "Nestle") 

    }) 

    output$candy_selector <- renderUI({ 

    available <- candyData[candyData$Brand == input$brand, "Candy"] 

    selectInput(
     inputId = "candy", 
     label = "Candy:", 
     choices = unique(available), 
     selected = unique(available)[1]) 

    }) 

}) 
## 
shinyApp(ui = ui, server = server) 

Aggiornato:

è possibile modificare la definizione ui essere

ui <- shinyUI({ 
    sidebarPanel(

    htmlOutput("brand_selector"), 
    htmlOutput("candy_selector"), 
    valueBoxOutput("count")) 

}) 

e aggiungi quanto segue a server:

output$count <- renderValueBox({ 

    available <- candyData[candyData$Brand == input$brand, ] 

    valueBox(
    value = nrow(available), 
    subtitle = sprintf("Number of %s Candy Bars", input$brand), 
    icon = icon("table")) 

}) 
+2

Questo ha funzionato splendidamente. Grazie mille! – Gary

+0

nrussell, ho ancora una domanda, in realtà. Nella parte superiore della mia app Shiny, ho un contatore che mostra il numero totale di barrette di cioccolato nel set di dati. Come posso avere questo contatore automaticamente aggiornato in base al successivo filtraggio? Ho inserito il mio codice corrente in una revisione. – Gary

+0

@Nick Aggiornato - e per riferimento futuro, dovresti fare una domanda * separata *, anche se è correlata al problema originale, in modo che le informazioni siano più facilmente ricercabili da altri utenti di questo sito. – nrussell