我正在创建一个传单,闪亮的应用程序,有几个不同的互动元素,我有一些问题,使所有的东西凝胶正确。
我创建了一些经过大量修剪的示例代码,(希望)能够捕捉到问题的严重程度:
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
z@data$data1 <- sample(1:20, size = length(z@data$OBJECTID), replace = T)
z@data$data2 <- sample(1:20, size = length(z@data$OBJECTID), replace = T)
z@data$data3 <- sample(1:20, size = length(z@data$OBJECTID), replace = T)
z@data$data4 <- sample(1:20, size = length(z@data$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("", z@data$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[z@data$NAME_0 == dd, ]
#define proxy map object for dynamic updating
proxy <- leafletProxy("myMap")
#create test layerId for polygon removal
test <- selected@data$OBJECTID
if(dd != ""){
#use proxy object so that tiles don't update with each slider input change
proxy %>%
# clearShapes() %>%
addPolygons(data = selected,
fillColor = ~pal(selected@data[[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发生了几件不同的事情。首先,从下拉选择菜单中选择感兴趣的国家(--保持初始地图输出为没有绘制多边形的空白瓷砖--只有在下拉菜单中的国家选择时才会绘制形状文件)。从那里,您可以使用滑块来更新choropleth地图的颜色方案。
我使用leafletProxy动态更新地图,这样用户每次启用某种交互性时就不会重新绘制地图。当使用滑块更新多边形样式时,这一点特别重要--如果每次都重新绘制地图,它会非常不稳定和不美观。当我运行上面写的代码时,结果(以简短的视频形式)是这里。正如你所看到的,颜色的变化是无缝的。
但是,使用此代码,我不知道如何删除以前绘制的映射元素(国家)。正如您在上面链接的示例中所看到的,当我单击第二个国家时,第一个选定的国家不会被移除。我意识到这是因为我正在使用leafletProxy更新地图。我很熟悉使用layerIds和removeShape()删除多边形,但由于我的代码的编写方式,我无法让它工作。我尝试过以几种不同的方式使用layerIds,但没有运气。
我能够删除以前选择的多边形,当我取消评论行clearShapes() %>%后,proxy调用。不幸的是,这会导致每次更新滑块时重新绘制地图,从而导致非常丑陋的波澜。
我是否可以使用leafletProxy删除先前选择的多边形,并使用滑块无缝地更新地图样式?
发布于 2017-02-14 12:47:43
我会将观察者()拆分,并对每个输入使用observeEvent()。在输入$ obervseEvent中对输入$country使用clearShapes(),而不对输入$test使用。
https://stackoverflow.com/questions/41028078
复制相似问题