2015-10-12 14 views
7

Ich habe zwei selectInput s, und ich möchte die Auswahl in der ersten (Marke), um die möglichen Auswahlen in der zweiten (Candy) zu ändern. Wenn zum Beispiel jemand im ersten Eingabefeld "Nestle" auswählt, dann werden nur Nestlé-Schokoriegel in der zweiten Box angezeigt. Meine Datentabelle hat eine Spalte für Marke und eine Spalte für Schokoriegel.Filter ein selectInput basierend auf der Auswahl eines anderen selectInput?

Ich habe den folgenden Code zu starten, aber dies zeigt alle Möglichkeiten, unabhängig von der Auswahl.

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" 

Der Datensatz sieht wie folgt aus:

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

Aktualisiert Frage Wie aktualisiere ich die ValueBox in meinem Armaturenbrett auf der Grundlage der nachfolgenden Filterung?

output$count <- renderValueBox({ 

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

Bitte geben Sie Ihre Datensatz 'candyData', und der Rest des Codes für Ihre Anwendung. – nrussell

+0

nrussell wurde der Beispieldatensatz angezeigt. – Gary

Antwort

10

Hier ist ein Ansatz:

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) 

Aktualisiert:

Sie die ui Definition ändern kann sein

ui <- shinyUI({ 
    sidebarPanel(

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

}) 

und fügen Sie nach dem zu 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

Das hat prächtig funktioniert. Vielen Dank! – Gary

+0

Nrussell, ich habe eigentlich noch eine Frage. Oben in meiner Shiny-App habe ich einen Zähler, der die Gesamtzahl der Schokoriegel im Datensatz anzeigt. Wie kann ich diesen Zähler basierend auf der nachfolgenden Filterung automatisch aktualisieren lassen? Ich habe meinen aktuellen Code in eine Revision gestellt. – Gary

+0

@Nick Aktualisiert - und für zukünftige Referenz sollten Sie eine * separate * Frage stellen, auch wenn sie mit dem ursprünglichen Problem zusammenhängt, damit die Informationen leichter von anderen Benutzern dieser Site durchsucht werden können. – nrussell