服务器不会更改地图输出

问题描述 投票:0回答:1

我是使用 Shiny 制作地图的新手,但我的目标是创建一个交互式地图,当您选择各种输入时,该地图会发生变化。例如:当您选择月份时,它将仅显示该给定月份的标记。当您选择年份时,它将显示该年和月份(依此类推)的观察结果。

现在我可以渲染地图,但地图上显示的点与用户在下拉选项中选择的点不对应。

这是我尝试过的代码:

library(shiny)
library(dplyr)
library(leaflet)

SampleData <- data.frame(year = c('2017', '2018', '2019', '2020'),
                         lon = c(38.62893, 38.62681, 38.62797, 38.62972),
                         lat = c(-90.26233, -90.25272, -90.26232, -90.25703),
                         month = c('January', 'February', 'March', 'April', 'May'),
                         new_use = c('Industrial', 'Institutional', 'Commercial', 'Residential')

use <- sort(unique(SampleData$new_use))
years <- sort(unique(SampleData$year))
months <- sort(unique(SampleData$month))

ui <- bootstrapPage(
    tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
    leafletOutput("map", width = "100%", height = "100%"),
    absolutePanel(top = 10, right = 10,
                  selectInput("month", "Month",
                              choices = sort(unique(SampleData$month))),
                  selectInput("year", "Year",
                              choices = sort(unique(SampleData$year))),
                  selectInput("new_use", "Permit Use",
                              choices = sort(unique(SampleData$new_use))),
    )
)

server <- function(input, output, session) {
    
    output$map <- renderLeaflet({
        leaflet() %>% 
            setView(lng = -90.1994, lat = 38.6270, zoom = 10)%>%
            addProviderTiles(providers$CartoDB.Positron)
    })
    
    # Reactive expression for the data subsetted to what the user selected
    filteredData <- reactive({
        dplyr::filter(SampleData, years %in% input$year & use %in% input$new_use & months %in% input$month)
    })
  
observe({
        leafletProxy("map") %>%
            clearShapes() %>%
            addMarkers(data = filteredData(), 
             ~lat, ~lon, popup = paste("<b>Year:</b> ", filteredData()$year, "<br>",
                  "<b>Permit Type:</b> ", filteredData()$new_use, "<br>")) 
    })
}    
    


shinyApp(ui, server)

有人有什么建议吗?我错过了什么?

r shiny r-leaflet
1个回答
0
投票

反应式语句中的过滤需要通过数据框中的列名来完成。例如,您需要“年”而不是“年”。

因此反应性语句应为:

filteredData <- reactive({
        dplyr::filter(SampleData, year %in% input$year & new_use %in% input$new_use & month %in% input$month)
    })

并清除您想要使用的先前标记

clearMarkers()
而不是
clearShapes()

但是,使用提供的示例数据框,仅当选择特定的年份、月份和用途组合时才会出现标记(这是在删除“五月”以使所有列长度相同之后)。例如,仅当用户选择“2017”、“一月”和“工业”时,第一个标记才会显示,因为这些是与第一对坐标关联的相应值(依此类推)。

© www.soinside.com 2019 - 2024. All rights reserved.