我了解获取空间多边形数据框并使用反应式表达式构建子集的语法。例如,允许滑块作为用户输入来缩小要显示的数据范围:
ui <- fluidPage(
sliderInput("range", "Scores", min(SPDF@data$Total_Score), max(SPDF@data$Total_Score),value = range(SPDF@data$Total_Score), step = 0.5)
)
server <- function(input, output) {
final.dat <- reactive({SPDF[SPDF@data$Total_Score >= input$range[1] & SPDF@data$Total_Score <= input$range[2],]
})
}
而且我知道我可以将 final.dat() 指定为后续渲染中的数据:例如 output$map <- renderLeaflet({leaflet(final.dat())})。但是,我正在尝试使用 leafletProxy 来更新我的地图,并且在填充多边形和基于新子集构建新图例时遇到了麻烦。我不能再使用 SPDF@data$column 语法来引用我的空间多边形数据框的所需列,因为它现在是函数 final.dat()。我尝试为 final.dat() 分配一个变量,然后使用 $column 语法,但它出错(参见下面的代码)。我还尝试用 SPDF@data$Column 和 ~Column 替换 SPDF$Column,所有版本都会导致错误。或者地图从不绘制。
错误包括:警告:pal2 中的错误:未使用的参数 (Total_Score) 错误:[on_request_read] 连接被对等方重置
使用反应式表达式并创建函数代替空间多边形数据框后,如何引用列?具体来说,当引用 addPolygon() 中的 fillColor 参数的列和 addLegend() 中的 values 参数时。谁能看到为什么我下面的代码没有生成地图(只是滑块)?非常感谢!
完整代码:
ui <- fluidPage(
leafletOutput("map"),
sliderInput("range", "Scores", min(SPDF@data$Total_Score),
max(SPDF@data$Total_Score),value = range(SPDF@data$Total_Score), step = 0.5)
)
server <- function(input, output) {
# Color palette
pal <- colorNumeric(palette = "YlOrRd", domain = SPDF$Total_Score)
# Initial Map
output$map <- renderLeaflet({leaflet() %>%
addTiles() %>%
addPolygons(data=SPDF,
fillColor = ~pal(Total_Score),
weight = 0.5,
opacity = 1,
color = "white") %>%
addLegend(position = "bottomleft",pal = pal, opacity = 0.7, values = SPDF$Total_Score, title = "<strong>Total Score</strong>")
})
# Subset data
final.dat <- reactive({
SPDF[SPDF@data$Total_Score >= input$range[1] & SPDF@data$Total_Score <= input$range[2],]
})
# New color palette
pal2 <- reactive({
SPDF <- final.dat()
colorNumeric(palette = "YlOrRd", domain = SPDF$Total_Score)
})
# Leaflet Proxy to update map
observe({
SPDF <- final.dat()
leafletProxy("map", data = SPDF) %>%
clearShapes() %>%
clearControls() %>%
addPolygons(
fillColor = ~pal2(Total_Score),
weight = 0.5,
opacity = 1,
color = "white") %>%
addLegend(position = "bottomleft",pal = pal2, opacity = 0.7, values = SPDF$Total_Score, title = "<strong>Total Score</strong>")
})
}
shinyApp(ui = ui, server = server)