r - 在 Leaflet Shiny 应用程序中,removeShape() 与 slider 交互性配合时出现问题

标签 r slider shiny leaflet interactive

我正在创建一个 Leaflet Shiny 应用程序,它有几个不同的交互元素,但我在将所有内容正确地组合在一起时遇到了一些问题。

我创建了一些经过严格修剪的示例代码(希望)能够捕获我的问题的严重程度:

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

有几个不同的事情正在发生。首先,从下拉选择菜单中选择您感兴趣的国家/地区(将初始 map 输出保留为不绘制多边形的空白图 block 非常重要 - shapefile 仅在从下拉菜单中选择国家/地区时绘制) 。从那里,您可以使用 slider 更新分区统计图的配色方案。

我使用 leafletProxy 动态更新 map ,这样每次用户启用某种交互性时就不会重新绘制 map 。当使用 slider 更新多边形样式时,这一点尤其重要 - 如果每次都重新绘制 map ,则会非常不稳定且难看。当我运行上面写的代码时,结果(以短视频形式)是 here 。正如您所看到的,颜色无缝变化。

但是,使用此代码,我不确定如何删除先前绘制的 map 元素(国家/地区)。正如您在上面的链接示例中看到的,当我单击第二个国家/地区时,第一个选定的国家/地区不会被删除。我意识到这是因为我使用 leafletProxy 来更新 map 。我熟悉使用layerIds和removeShape()来删除多边形,但是按照我的代码编写方式,我无法让它工作。我尝试过以几种不同的方式使用 LayerId,但运气为零。

当我在 proxy 调用之后取消注释行 clearShapes() %>% 时,我能够删除之前选择的多边形。不幸的是,这会导致每次更新 slider 时都会重新绘制 map ,从而导致 really ugly choppiness

有什么方法可以使用leafletProxy来删除以前选择的多边形并使用 slider 无缝更新 map 样式吗?

最佳答案

我会将您的observe() 分开并为每个输入使用observeEvent()。在 obervseEvent 中对 input$country 使用clearShapes(),但不能对 input$test 使用。

关于r - 在 Leaflet Shiny 应用程序中,removeShape() 与 slider 交互性配合时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41028078/

相关文章:

r - 强制 Shiny 以循环渲染图

r - 使用 sparklyr 将字符串/字符转换为日期

r - 在 R 中将 xts 强制为 ts

r - 通过将空格填充到指定长度来使字符串居中

javascript - 如何在 slider 博主中居中图像

javascript - 查找当前幻灯片 div 并添加类

javascript - 使用基本的 jQuery slider

python - 如何在 R 中重新获取 Python 变量?

r - 在传单 Shiny 中拖动标记后如何更新坐标?

javascript - 在 htmlWidgets 的 onRender() 中修改选定点的有效方法