2016-05-07 18 views
1

Ich folge this tutorial zu lernen, Shiny Apps zu bauen. In der endgültigen Version enthält die renderUI() für "Land" nur alle Länder im Datensatz. Gibt es eine Möglichkeit, diese Liste basierend auf dem mit dem Schieberegler ausgewählten Preisbereich reaktiv/gefiltert zu machen? HierCreating reactive renderUI

ist der entsprechende Code:

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

Und hier ist das ganze. sehr einfache App:

library(shiny) 
library(ggplot2) 
library(dplyr) 

bcl <- read.csv("bcl-data.csv", stringsAsFactors = FALSE) 

ui <- fluidPage(
     titlePanel("BC Liquor Prices", windowTitle = "Mmmmm yeh"), 
     sidebarLayout(
      sidebarPanel(
      sliderInput("priceInput", "Price", 
         min = 0, max = 100, 
         value = c(25, 40), pre = "$" 
         ), 
      radioButtons("typeInput", "Product type", 
          choices = c("BEER", "REFRESHMENT", "SPIRITS", "WINE"), 
          selected = "WINE" 
         ), 
      uiOutput("countryOutput") 
      ), 
      mainPanel(plotOutput("coolplot"), 
        br(), 
        br(), 
        tableOutput("results") 
        ) 
      ) 
    ) 
server <- function(input, output, session) { 

    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$countryOutput <- renderUI({ 
    selectInput("countryInput", "Country", 
       sort(unique(bcl$Country)), 
       selected="CANADA") 
    }) 

    output$coolplot <- renderPlot({ 
    if (is.null(filtered())) {return()} 
         ggplot(filtered(), aes(Alcohol_Content)) + geom_histogram() 
        }) 

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

shinyApp(ui = ui, server = server) 

Antwort

2

diesen Code Versuchen ... Sie müssen zwei verschiedene reaktive Werte: 1) Man kann die Länderliste erzeugen, basierend auf den ersten zwei Eingängen und 2) Zwei zwei der Plot und Tabelle, die Ergebnisse erzeugen, basierend auf das ausgewählte Land.

Außerdem änderte ich die Namen, um die tatsächlichen Spaltennamen wiederzugeben, die ich beim Lesen dieser Datei erhalte. Sie müssen möglicherweise zurück ändern, wenn Sie sie in einem anderen Teil des Codes geändert haben.

library(shiny) 
library(ggplot2) 
library(dplyr) 

bcl <- read.csv("bcl-data.csv", stringsAsFactors = FALSE) 

ui <- fluidPage(
    titlePanel("BC Liquor Prices", windowTitle = "Mmmmm yeh"), 
    sidebarLayout(
    sidebarPanel(
     sliderInput("priceInput", "Price", 
        min = 0, max = 100, 
        value = c(25, 40), pre = "$" 
    ), 
     radioButtons("typeInput", "Product type", 
        choices = c("BEER", "REFRESHMENT", "SPIRITS", "WINE"), 
        selected = "BEER" 
    ), 
     uiOutput("countryOutput") 
    ), 
    mainPanel(plotOutput("coolplot"), 
       br(), 
       br(), 
       tableOutput("results") 
    ) 
) 
) 

server <- function(input, output, session) { 
    filteredForCountry <- reactive({ 
    bcl %>% 
     filter(
     CURRENT_DISPLAY_PRICE >= input$priceInput[1], 
     CURRENT_DISPLAY_PRICE <= input$priceInput[2], 
     PRODUCT_SUB_CLASS_NAME == input$typeInput 
    ) 
    }) 
    output$countryOutput <- renderUI({ 
    df <- filteredForCountry() 
    if (!is.null(df)) { 
     selectInput("countryInput", "Country", 
        sort(unique(df$PRODUCT_COUNTRY_ORIGIN_NAME)), 
        selected="CANADA") 
    } 
    }) 

    filteredFull <- reactive({ 
    if (is.null(input$countryInput)) { 
     return (filteredForCountry()) 
    } 
    bcl %>% 
     filter(
     CURRENT_DISPLAY_PRICE >= input$priceInput[1], 
     CURRENT_DISPLAY_PRICE <= input$priceInput[2], 
     PRODUCT_SUB_CLASS_NAME == input$typeInput, 
     PRODUCT_COUNTRY_ORIGIN_NAME == input$countryInput 
    ) 
    }) 
    output$coolplot <- renderPlot({ 
    if (is.null(filteredFull())) {return()} 
    ggplot(filteredFull(), aes(PRODUCT_ALCOHOL_PERCENT)) + 
     geom_histogram(binwidth = 0.05) 
    }) 

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

shinyApp(ui = ui, server = server) 
+0

Eigentlich ist es Ihr Kommentar über das funktioniert, nicht das. Es scheint, dass ich einen anderen Filter erstellen muss, da 'filtered()' bereits "Country" enthält. Betrachte ich das richtig? –

+0

Ihr reactive verwendet 'input $ countryInput', aber ich kann es nirgendwo im Code finden. – Gopala

+0

Mit anderen Worten, die Reparatur, die reaktiv ist und den obigen Code verwendet, sollte funktionieren. Wenn nicht, lass es mich wissen. Wenn es eine Möglichkeit gibt, die Daten zu posten, kann ich sie testen und validieren. – Gopala