2

我了解获取空间多边形数据框并使用反应式表达式构建子集的语法。例如,允许滑块作为用户输入来缩小要显示的数据范围:

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) 
4

0 回答 0