gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:17:43 25 4
gpt4 key购买 nike

我正在创建一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com