首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >removeShape()在小叶闪亮应用程序中与滑块交互作用的问题

removeShape()在小叶闪亮应用程序中与滑块交互作用的问题
EN

Stack Overflow用户
提问于 2016-12-07 21:54:42
回答 1查看 664关注 0票数 2

我正在创建一个传单,闪亮的应用程序,有几个不同的互动元素,我有一些问题,使所有的东西凝胶正确。

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

代码语言:javascript
复制
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删除先前选择的多边形,并使用滑块无缝地更新地图样式?

EN

回答 1

Stack Overflow用户

发布于 2017-02-14 12:47:43

我会将观察者()拆分,并对每个输入使用observeEvent()。在输入$ obervseEvent中对输入$country使用clearShapes(),而不对输入$test使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41028078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档