我对Shiny和R一般是新手,所以我确定这是一个非常简单的问题,但我花了很长时间才想弄明白并且无处可去所以任何帮助都会非常感激!我现在所拥有的主要基于这篇文章Leaflet R shiny: select & zoom
我正在尝试创建一个应用,让用户定义他们想要查看的国家/地区,然后该应用将缩放到该国家/地区。每个国家/地区由质心的lat,lng,缩放级别和名称定义。我的代码是这样的:
UI
var.zoom <- setNames(as.numeric(country_centroid$COUNTRY),country_centroid$COUNTRY)
shinyUI(navbarPage("SnailViz", theme = shinytheme("united"),
tabPanel("Map",
fluidPage(
fluidRow(column(width =3,id = "visualization", fixed = TRUE,
h1("Visualization", align = "center"),
wellPanel(fluidRow(selectInput("countryZoom", label = h3("Zoom to"),
choices = var.zoom)))),
column( 9, id = "mapp", fixed =TRUE,
leafletOutput("map", width = "100%", height= 850))
))))
server.R
shinyServer(function(input, output, session) {
output$map <- renderLeaflet({
leaflet() %>%
addPolygons( data = climateZones, fillOpacity = 0.5, fillColor = ~pal_grid(climateZones$Climate), stroke = FALSE) %>%
addLegend(pal = pal_grid, values = climateZones$Climate, title = "Climate Zones") %>%
addProviderTiles("CartoDB.Positron",group="CartoDB.Positron",options = providerTileOptions(opacity = 1)) %>%
setView(lat=1.701620, lng = 17.27356, zoom = 4)
})
Zooming <-reactive({
subset(country_centroid, COUNTRY == input$countryZoom)})
observe({
leafletProxy("map") %>%
setView(lng=Zooming()$X,lat=Zooming()$Y,zoom = Zooming()$Level)
})
})
country_centroid
X Y Level COUNTRY
17.27 1.70 4 Africa
-1.74 12.28 8 Burkina Faso
29.88 -3.37 8 Burundi
12.74 5.69 8 Cameroon
23.65 -2.87 8 Congo DRC
29.51 26.3 8 Egypt
39.63 8.62 8 Ethiopia
-1.20 7.97 8 Ghana
-5.55 7.63 8 Ivory Coast
37.81 0.60 8 Kenya
34.30 -13.21 8 Malawi
-3.52 17.36 8 Mali
-8.89 29.11 8 Morocco
8.11 9.62 8 Nigeria
-14.45 14.36 8 Senegal
-11.78 8.56 8 Sierra Leone
30.01 16.05 8 Sudan
34.80 -6.26 8 Tanzania
9.57 34.11 8 Tunisia
32.38 1.27 8 Uganda
27.79 -13.45 8 Zambia
29.87 -19.00 8 Zimbabwe
基本上一切都按照我的预期显示,但是当我使用下拉列表更改输入时,地图不会响应。我对此的理解是非常基本的,但我认为我对observe()有一些问题,但我从其他帖子中尝试过很多东西,而且此时我基本上处于亏损状态。提前谢谢!!
答案 0 :(得分:0)
使用var.zoom
作为selectInput
的选项,input$countryZoom
是一个数字,因此您必须在as.numeric
中使用subset
:
subset(country_centroid, as.numeric(COUNTRY) == input$countryZoom))