2016-06-01 7 views
2

Mit Rstudio versuche ich eine glänzende App zu erstellen, die Leaflet-Ausgaben produziert. Beachten Sie, dass "Glänzend" ein Paket ist, das ich vorher noch nicht verwendet habe. Es könnte also sein, dass es im Skript andere Fehler gibt als das, dem ich gerade begegne.Wie man einen Dataframe und einen Plot mit einem Leaflet abhängig von der Eingabe in einen glänzenden Bereich setzt

Ich benutze ein Datenframe mit Spuren von verschiedenen Individuen, von denen ich Teilmenge und die Spur eines Tieres als Reaktion auf Inputselection plotten möchte.

Sample: 

WhaleID  lat  long 
gm08_150c 68,4276 16,5192 
gm08_150c 68,4337 16,5263 
gm08_150c 68,4327 16,5198 
gm08_154d 68,4295 16,5243 
gm08_154d 68,4313 16,5314 
gm08_154d 68,4281 16,5191 

Die Auswahlmöglichkeiten in der Eingangswahl sind die genauen Namen in der CSV-Datei verwendet, in der Spalte WhaleID, so würde ich die Teilmenge alle Zeilen mit diesen WhaleID von dem Hauptdatenrahmen mag.

Nach dieser Teilmenge möchte ich nur die Spalten "long" und "lat" aus dem zuvor unterteilten Datenrahmen unterteilen. Dieser Datenrahmen wird dann per Prospekt gelesen.

Der letzte Schritt ist das Zeichnen dieser "langen" und "lat" Positionen auf einer Karte.

Ich erhalte eine Fehlermeldung leider:

Warning: Error in $: object of type 'closure' is not subsettable 
Stack trace (innermost first): 
    82: inherits 
    81: resolveFormula 
    80: derivePolygons 
    79: addPolylines 
    78: function_list[[i]] 
    77: freduce 
    76: _fseq 
    75: eval 
    74: eval 
    73: withVisible 
    72: %>% 
    71: func [#15] 
    70: output$map 
    4: <Anonymous> 
    3: do.call 
    2: print.shiny.appobj 
    1: <Promise> 

Das Skript Ich verwende:

require(shiny) 
    require(leaflet) 

    ##Main dataframe I want to subset depending on inputselection  
    dataframe <-read.csv2("PW_with_speedbearingturn.csv") 


    ui <- bootstrapPage( 
     tags$style(type = "text/css", "html, body {width:100%;height:100%}"), 
     absolutePanel(top = 10, right = 10, 
     selectInput(inputId = "whaleID", 
        label = "Select a whale", 
        choices = c("gm08_150c","gm08_154d"))), 
     leafletOutput(outputId = "map", width = "100%", height = "700") 
    ) 

    server <- function(input, output, session){ 

     #?observeEvent 
     #observeEvent(input$whaleID,) 
     Start <- makeIcon(
     iconUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Dark_Green_Arrow_Down.svg/480px-Dark_Green_Arrow_Down.svg.png", 
     iconWidth = 22, iconHeight = 20, 
     iconAnchorX = 11, iconAnchorY = 20) 

     eventReactive(input$whaleID,{ 
        df<-subset(dataframe, WhaleID == "input$whaleID") ## "input$whaleID" should become the WhaleID that is selected from the inputselect. 

        df<-subset(df, select = c("long", "lat")) 
     })     
     output$map <- renderLeaflet({ 
     leaflet() %>% 
     addTiles() %>% 
     addPolylines(df, lng = df$long, lat = df$lat, col = "grey", opacity = 1)%>% 
     addMarkers(df, lng = first(df$long), lat = first(df$lat), icon = Start, popup = "Start") 
     }) 
    } 

    shinyApp(ui = ui, server = server) 

Ich glaube, es mit dem eventreactive Abschnitt zu tun hat und der subsetting Teil innerhalb. Sie muss jedes Mal aktualisiert werden, wenn die Auswahl aus der Eingabeauswahl ausgewählt wurde. Leider konnte ich keine existenten Lösungen für diese Frage finden.

Gibt es Ratschläge zur Lösung dieses Problems?

Vielen Dank im Voraus,

Onno

+0

Würde es helfen, eine Schicht für jede Wal-ID zu haben? Wenn ja, wie viele individuelle IDs hast du? – TimSalabim

Antwort

2

Ich glaube, Sie die eventReactive seit dem renderLeaflet auf Änderungen input reaktiv sein ganz vermeiden können. Hier ist ein angepasstes Beispiel, da ich Ihre Daten nicht habe. Lass es mich wissen, wenn es keinen Sinn ergibt.

require(shiny) 
require(leaflet) 

##Main dataframe I want to subset depending on inputselection  
dataframe <- data.frame(
    abb = state.abb, 
    x = state.center$x, 
    y = state.center$y, 
    stringsAsFactors = FALSE 
) 


ui <- bootstrapPage( 
    tags$style(type = "text/css", "html, body {width:100%;height:100%}"), 
    absolutePanel(top = 10, right = 10, 
       selectInput(inputId = "whaleID", 
          label = "Select a state", 
          choices = dataframe[["abb"]])), 
    leafletOutput(outputId = "map", width = "100%", height = "700") 
) 

server <- function(input, output, session){ 

    Start <- makeIcon(
    iconUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Dark_Green_Arrow_Down.svg/480px-Dark_Green_Arrow_Down.svg.png", 
    iconWidth = 22, iconHeight = 20, 
    iconAnchorX = 11, iconAnchorY = 20) 


    output$map <- renderLeaflet({ 
    df <- subset(dataframe, abb == input$whaleID) 
    leaflet() %>% 
     addTiles() %>% 
     #addPolylines(df, lng = df$long, lat = df$lat, col = "grey", opacity = 1)%>% 
     addMarkers(data = df, lng = ~x, lat = ~y, icon = Start, popup = "Start") 
    }) 
} 

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

Vielen Dank für Ihre Antwort, es hat mir geholfen, das Problem zu lösen und das Skript funktioniert nun korrekt. –

Verwandte Themen