2016-12-07 1 views
1

Ich erstelle eine Leaflet Shiny App, die mehrere verschiedene interaktive Elemente hat und ich habe einige Probleme bekommen alles richtig zusammen zu gelieren.Probleme mit removeShape() Zusammenarbeit mit Schieberegler Interaktivität in Leaflet Shiny App

Ich habe einige stark beschnitten Beispielcode erstellt, die (hoffentlich) das Ausmaß meines Problems erfasst:

library(raster) 
library(RColorBrewer) 
library(leaflet) 
library(shiny) 

#load rwa shapefile, remove extra columns 
rwa <- getData("GADM", country = "RWA", level = 1) 
rwa <- rwa[, -(6:13)] 

#load bdi shapefile, remove extra columns, prepare to merge with rwa 
bdi <- getData("GADM", country = "BDI", level = 1) 
bdi <- bdi[, -(6:13)] 
bdi <- spChFIDs(bdi, paste("bdi", row.names(bdi), sep = ".")) 

#merge 
z <- rbind(rwa, bdi) 

#add dummy data 
[email protected]$data1 <- sample(1:20, size = length([email protected]$OBJECTID), replace = T) 
[email protected]$data2 <- sample(1:20, size = length([email protected]$OBJECTID), replace = T) 
[email protected]$data3 <- sample(1:20, size = length([email protected]$OBJECTID), replace = T) 
[email protected]$data4 <- sample(1:20, size = length([email protected]$OBJECTID), replace = T) 



#define color palettes 
colorPal <- brewer.pal(4, "RdYlGn") 
pal <- colorBin(palette = colorPal, domain = 1:20, bins = c(0, 5, 10, 15, 20), pretty = T) 

#run shiny app 
shinyApp(
    ui = fluidPage(

    #country dropdown selection 
    selectInput(inputId = "country", 
       label = "Country", 
       choices = c("", [email protected]$NAME_0), 
       selected = ""), 

    #test slider 
    sliderInput(inputId = "test", 
          label = "Test Slider", 
          min = 1, 
          max = 4, 
          value = 0, 
          step = 1, 
          animate = T), #end slider 

    #map image 
    leafletOutput('myMap')#end output, c6, fluidrow 
), #END UI 



    #world level default map output 
    server <- function(input, output, session) { 

    #initial map rendering (blank tiles) 
    output$myMap <- renderLeaflet({ 
     leaflet() %>% 
     addProviderTiles("CartoDB.PositronNoLabels", 
         options = tileOptions(noWrap = T)) %>% 
     setView(lng = 29.85, lat = -2.7, zoom = 7) 
    }) #END LEAFLET OUTPUT 


    #observe slider to update map 
    observe({ 

     #define input as variable 
     x <- input$test 

     #create object for input country 
     dd <- input$country 

     #subset regions polygon by the selected country 
     selected <- z[[email protected]$NAME_0 == dd, ] 

     #define proxy map object for dynamic updating 
     proxy <- leafletProxy("myMap") 

     #create test layerId for polygon removal 
     test <- [email protected]$OBJECTID 

     if(dd != ""){ 

     #use proxy object so that tiles don't update with each slider input change 
     proxy %>% 
      # clearShapes() %>% 
      addPolygons(data = selected, 
           fillColor = ~pal([email protected][[x + 5]]), #add 5 to match column number 
           fillOpacity = 1, 
           weight = 1, 
           stroke = T, 
           layerId = test) 
     } #END CONDITIONAL 
    }) #END OBSERVE EVENT 
    } #END SERVER 
) #END SHINYAPP 

Es gibt verschiedene Dinge geht. Zuerst wählen Sie Ihr gewünschtes Land aus dem Dropdown-Auswahlmenü (). Es ist wichtig, dass die ursprüngliche Kartenausgabe als leere Kacheln ohne Polygone gezeichnet wird - Shapefiles werden nur bei Länderauswahl aus dem Dropdown-Menü gezeichnet. Von dort können Sie den Schieberegler verwenden, um das Farbschema der Choropleth-Map zu aktualisieren.

Ich benutze leafletProxy, um die Karte dynamisch zu aktualisieren, so dass es nicht jedes Mal neu gezeichnet wird, wenn der Benutzer eine Art von Interaktivität aktiviert. Dies ist besonders wichtig, wenn Sie den Schieberegler zum Aktualisieren der Polygonstile verwenden. Wenn die Karte jedes Mal neu gezeichnet wird, ist sie sehr unruhig und unansehnlich. Wenn ich den Code wie oben beschrieben ausführe, ist das Ergebnis (in einem kurzen Videoformat) here. Wie Sie sehen können, ändern sich die Farben nahtlos.

Mit diesem Code bin ich jedoch nicht sicher, wie Kartenelemente (Länder) entfernt werden, die zuvor gezeichnet wurden. Wie Sie im oben verlinkten Beispiel sehen können, wenn ich auf ein zweites Land klicke, wird das zuerst ausgewählte Land nicht entfernt. Ich weiß, dass dies daran liegt, dass ich leafletProxy verwende, um die Karte zu aktualisieren. Ich bin vertraut mit der Verwendung von LayerIds und removeShape(), um Polygone zu entfernen, aber mit der Art, wie mein Code geschrieben wird, kann ich es nicht zum Laufen bringen. Ich habe versucht, die LayerIds auf mehrere verschiedene Arten zu verwenden, ohne Glück.

ich ist kann zuvor ausgewählte Polygone entfernen, wenn ich die Linie clearShapes() %>% nach dem proxy Anruf Kommentar-. Leider führt dies dazu, dass die Karte jedes Mal neu gezeichnet wird, wenn der Schieberegler aktualisiert wird, was zu really ugly choppiness führt.

Gibt es eine Möglichkeit, dass ich leafletProxy verwenden kann, um zuvor ausgewählte Polygone zu entfernen UND nahtlos den Kartenstil mit dem Schieberegler zu aktualisieren?

Antwort

0

Ich würde Ihre Beobachtung() aufteilen und observeEvent() für jeden der Eingänge verwenden. Verwenden Sie clearShapes() im ObervseEvent für Eingabe $ country, aber nicht für Eingabe $ test.

Verwandte Themen