2014-06-18 12 views
5

Ich mache mich vertraut mit Shiny, aber vertraut könnte ein bisschen eine Übertreibung sein ... Ich versuchte die Shiny Tutorials, speziell ich würde Lesson 5 für meine eigene data anpassen.Shiny und ggplot2 - Tutorial

habe ich ein zusätzliches R-Script help.R, wie im Tutorial:

percent_map <- function(var, color, legend, min = 0, max = 100) { 

# constrain gradient to percents that occur between min and max 
var <- pmax(var, min) 
var <- pmin(var, max) 

#plot 
aha <- ggplot(abst, aes(long,lat, group=group))+ 
     geom_polygon(aes(fill=var))+ 
     coord_fixed()+ 
     scale_fill_gradient(low = "lightskyblue", high = color, 
        space = "Lab", na.value = "lightblue")+ 
     labs(title=var, x="", y="")+ 
     theme(axis.text=element_blank(), 
     axis.ticks=element_blank(), 
     panel.grid.minor = element_blank(), 
     panel.background = element_blank() 
     ) 
print(aha) 
} 

Meine ui.R:

library(shiny) 

# Define UI for application that draws a histogram 
shinyUI(fluidPage(
titlePanel("Ja-Anteil von Abstimmungen"), 

sidebarLayout(
sidebarPanel(
    helpText("Create maps with information from ballot outcomes."), 

    selectInput("var", 
       label = "Choose a variable to display", 
       choices = c("Epidemiegesetz", 
          "BG", 
          "1:12", 
          "Familien", 
          "Nationalstrassenabgabegesetz"), 
       selected = "Epidemiegesetz"), 

    sliderInput("range", 
       label = "Range of interest:", 
       min = 0, max = 100, value = c(0, 100)) 

), 

mainPanel(plotOutput("map")) 
) 
)) 

Und meine server.R:

library(ggplot2) 

abst <- readRDS("~/try.RDS") 
abst$KANTONSNR <- as.numeric(abst$KANTONSNR) 

source("~/help.R") 

library(shiny) 

shinyServer(
function(input, output) { 
output$map <- renderPlot({ 
    data <- switch(input$var, 
       "Epidemiegesetz" = abst$Epidemiegesetz, 
       "BG" = abst$BG, 
       "1:12" = abst$Loehne, 
       "Familien" = abst$Familien, 
       "Nationalstrassenabgabegesetz" = abst$Nationalstrassenabgabegesetz) 

    color <- switch(input$var, 
        "Epidemiegesetz" = "darkgreen", 
        "BG" = "red", 
        "1:12" = "darkorange", 
        "Familien" = "darkviolet", 
        "Nationalstrassenabgabegesetz" = "darkblue") 

    legend <- switch(input$var, 
        "Epidemiegesetz" = "Epidemiegesetz", 
        "BG" = "BG", 
        "1:12" = "Sozis", 
        "Familien" = "Familien", 
        "Nationalstrassenabgabegesetz" = "blablabla") 

    percent_map(var = data, color = color, max = input$range[2], min = input$range[1]) 
    }) 
    } 
) 

Aber das ist nicht auch aus der Ferne arbeiten:

Error: arguments imply differing number of rows: 0, 179493 

Was mache ich falsch? Vielen Dank im Voraus.

+0

Können Sie versuchen, das Problem einzugrenzen? Ich habe versucht, ein statisches Diagramm (d. H. Ohne Glanz) zu erstellen, und es wird "Fehler: Diskreter Wert an kontinuierlichen Maßstab geliefert". Sind Sie sicher, dass der Zeichencode wie erwartet funktioniert? – tonytonov

+0

Ich bin mir sicher, dass die Handlung funktioniert, wenn ich eine normale ggplot Map erzeuge (natürlich muss der 'scale_fill_gradient' Befehl' high' angegeben werden. – Thomas

Antwort

4

Anstatt die Daten direkt an percent_map zu übergeben, übergeben Sie den Spaltennamen. Es wird auch schneller sein, da es zusätzliches Kopieren vermeidet. Hier ist eine modifizierte Funktion:

percent_map <- function(var, color, legend, min = 0, max = 100) { 

    # constrain gradient to percents that occur between min and max 
    abst$tmp_var <- abst[[var]] 
    abst$tmp_var <- pmax(abst$tmp_var, min) 
    abst$tmp_var <- pmin(abst$tmp_var, max) 

    #plot 
    aha <- ggplot(abst, aes(long, lat, group=group))+ 
    geom_polygon(aes(fill = tmp_var))+ 
    coord_fixed()+ 
    scale_fill_gradient(low = "lightskyblue", high = color, 
         space = "Lab", na.value = "lightblue")+ 
    labs(title=var, x="", y="")+ 
    theme(axis.text=element_blank(), 
      axis.ticks=element_blank(), 
      panel.grid.minor = element_blank(), 
      panel.background = element_blank() 
    ) 
    print(aha) 
    abst$tmp_var <- NULL 
} 

Und ein Update für server.R.

shinyServer(
    function(input, output) { 
    output$map <- renderPlot({ 
     data <- switch(input$var, 
        "Epidemiegesetz" = "Epidemiegesetz", 
        "BG" = "BG", 
        "1:12" = "Loehne", 
        "Familien" = "Familien", 
        "Nationalstrassenabgabegesetz" = "Nationalstrassenabgabegesetz") 

     color <- switch(input$var, 
         "Epidemiegesetz" = "darkgreen", 
         "BG" = "red", 
         "1:12" = "darkorange", 
         "Familien" = "darkviolet", 
         "Nationalstrassenabgabegesetz" = "darkblue") 

     legend <- switch(input$var, 
         "Epidemiegesetz" = "Epidemiegesetz", 
         "BG" = "BG", 
         "1:12" = "Sozis", 
         "Familien" = "Familien", 
         "Nationalstrassenabgabegesetz" = "blablabla") 

     percent_map(var = data, color = color, max = input$range[2], min = input$range[1], legend = legend) 
    }) 
    } 
) 

Als Randnotiz wird legend Argument ist nicht, meinen Sie labs(title=legend, x="", y="") haben?

Wie auch immer, es läuft jetzt ohne Fehler.

+0

Vielen Dank, es funktioniert - fast perfekt. Die Karte scheint einfarbig zu sein Jetzt, wie kann ich die Gradation zurück in bekommen? – Thomas

+0

@Thomas Ich habe meine Antwort bearbeitet, um 'pmin/pmax' Teil richtig zu behandeln. Jetzt funktioniert der Schieberegler wie vorgesehen. – tonytonov

+0

Einfach perfekt, danke @tonytonov – Thomas

Verwandte Themen