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?