我是使用 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)
有人有什么建议吗?我错过了什么?
反应式语句中的过滤需要通过数据框中的列名来完成。例如,您需要“年”而不是“年”。
因此反应性语句应为:
filteredData <- reactive({
dplyr::filter(SampleData, year %in% input$year & new_use %in% input$new_use & month %in% input$month)
})
并清除您想要使用的先前标记
clearMarkers()
而不是 clearShapes()
。
但是,使用提供的示例数据框,仅当选择特定的年份、月份和用途组合时才会出现标记(这是在删除“五月”以使所有列长度相同之后)。例如,仅当用户选择“2017”、“一月”和“工业”时,第一个标记才会显示,因为这些是与第一对坐标关联的相应值(依此类推)。