2016-12-07 9 views
1

여러 상호 작용 요소가 포함 된 전단지 반짝 이는 응용 프로그램을 만들고 있는데 모든 항목을 올바르게 함께 연결하는 데 문제가 있습니다.전단지 내에서 슬라이더 상호 작용과 협력하는 removeShape() 문제 반짝이는 앱

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 

일이 일어나고 여러 가지가 있습니다

나는 (희망) 내 문제의 범위를 캡처 약간 크게 손질 예제 코드를 만들었습니다. 먼저 드롭 다운 선택 메뉴 ()에서 원하는 국가를 선택합니다. 초기지도 출력을 다각형이없는 빈 타일로 유지하는 것이 중요합니다. 즉, 모양 파일은 드롭 다운 메뉴에서 국가 선택시에만 그려집니다. 여기에서 슬라이더를 사용하여 choropleth 맵의 색 구성표를 업데이트 할 수 있습니다.

저는 사용자가 일종의 상호 작용을 가능하게 할 때마다 다시 그려지지 않도록지도를 동적으로 업데이트하기 위해 leafletProxy를 사용하고 있습니다. 이것은 슬라이더를 사용하여 다각형 스타일을 업데이트 할 때 특히 중요합니다. 매번 다시 그려지는지도가 고르지 못하고보기 흉한 경우입니다. 위에서 작성한대로 코드를 실행하면 짧은 비디오 형식의 결과는 here입니다. 보시다시피 색상이 자연스럽게 바뀝니다.

그러나이 코드를 사용하면 이전에 그려진지도 요소 (국가)를 제거하는 방법을 모르겠습니다. 위의 링크 된 예에서 볼 수 있듯이 두 번째 국가를 클릭하면 처음 선택한 국가는 삭제되지 않습니다. 내가 leafletProxy을 사용하여지도를 업데이트했기 때문에 이것이 실현되었습니다. 폴리곤을 제거하기 위해 layerIds와 removeShape()을 사용하는 것에 익숙하지만, 코드 작성 방법과 함께 작동시킬 수는 없습니다. 나는 제로 행운과 함께 여러 가지 방법으로 layerIds를 사용하려고 시도했습니다.

proxy 호출 후 clearShapes() %>% 줄의 주석을 제거 할 때 이전에 선택한 다각형을 제거 할 수 있습니다. 안타깝게도 슬라이더가 업데이트 될 때마다지도가 다시 그려 지므로 really ugly choppiness이됩니다.

leafletProxy을 사용하여 이전에 선택한 다각형을 모두 제거하고 슬라이더로 맵 스타일을 완벽하게 업데이트 할 수있는 방법이 있습니까?

답변

0

나는 observe()를 나눠서 각 입력에 대해 observeEvent()를 사용했다. 입력 $ country에서는 obervseEvent에서 clearShapes()를 사용하고 입력 $ test에서는 사용하지 마십시오.