여러 상호 작용 요소가 포함 된 전단지 반짝 이는 응용 프로그램을 만들고 있는데 모든 항목을 올바르게 함께 연결하는 데 문제가 있습니다.전단지 내에서 슬라이더 상호 작용과 협력하는 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
을 사용하여 이전에 선택한 다각형을 모두 제거하고 슬라이더로 맵 스타일을 완벽하게 업데이트 할 수있는 방법이 있습니까?