r 中的 Leaflet 代理仅显示最新添加的图层

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

我想在传单地图中直观地看到州和社区层面致命交通事故和重伤事故的发展情况。 作为解决方案,我使用带有单选按钮的闪亮应用程序,用于在州和社区级别之间切换,并使用传单基础层组在死亡或重伤的可视化之间切换。此外,还有一个复选框可以选择不同的社区集群。 对于社区来说,一切正常,但对于州来说,似乎只显示了传单代理中最后添加的层。当我切换到州一级的死亡人数时,没有显示任何内容。如果我更改顺序,则不会显示州级重伤事故。 我尝试将传单代理分成两个观察块,但似乎没有任何效果。

library(sf)
library(tidyverse)
library(leaflet)
library(shiny)
library(leaflet.extras)
library(ggplot2)
library(htmlwidgets)
library(dplyr)


readRDS(land, "stackoverflow_state.rds")
readRDS(communities, "stackoverflow_communities.rds")

pal_leaf_heavy= colorFactor(palette = c("red", "yellow", "green", "darkgreen"), 
                      levels = c(4, 3,2,1))

pal_leaf_fatal = colorFactor(palette=c("yellow", "green", "darkgreen"),
                             levels=c(3,2,1))


ui = fluidPage(
  sidebarLayout(position = "left",
                sidebarPanel(
                  checkboxGroupInput("regiostar_selection", "Regiostarklasse", 
                                     choices=c(51,52,53,54),
                                     selected=c(51,52,53,54),
                                     inline=TRUE),
                  radioButtons("level", "Ebene: ", choices=c("Gemeinde", "Bundesland"), inline=TRUE, selected="Gemeinde")
                ),
                mainPanel( width=12,
                             column(8, leafletOutput("map", height="85vh"))
                           )
                )
  )

server <- function(input, output, session){
  f_communities <- reactive({
    if(length(input$regiostar_selection) > 0){
      communities %>% filter(RegioStaRGem5 %in% input$regiostar_selection)
    }
    else{
      communities
    }
  })
  
  
  level_data <- reactive({
    switch(input$level,
           "Gemeinde" = f_communities(),
           "Bundesland" = land
    )
  })
  
  output$map=renderLeaflet({leaflet() %>% addTiles() %>% 
      addPolygons(data=communities, layerId =communities$AGS, col=pal_leaf_heavy(communities$heavy_rating), label=communities$GEN, group="Entwicklung Unfaelle mit Schwerstverletzten") %>%
      addPolygons(data=communities, col=pal_leaf_fatal(communities$fatal_rating), group="Entwicklung toedliche Unfaelle", label=communities$GEN,
                  layerId=communities$AGS) %>%
      addLegend(colors=c("darkgreen","lightgreen", "yellow", "red"), 
                labels = c("Zielwert für 2030 erreicht", "Jahresziel erreicht", "Zahlen sind gesunken seit 2019, aber Jahresziel nicht erreicht", "Zahlen seit 2019 nicht gesunken" ), 
                group="Legend Unfaelle mit Schwerstverletzten") %>%
      addLegend(colors=c("darkgreen", "lightgreen", "yellow"),
                labels=c("Vision Zero erreicht", "Zielwert für 2030 erreicht", "Ziel noch nicht erreicht"),
                group="Legend toedliche Unfaelle") %>%
      addLayersControl(baseGroups = c("Entwicklung Unfaelle mit Schwerstverletzten", "Entwicklung toedliche Unfaelle"),
                       overlayGroups = c("Legend Unfaelle mit Schwerstverletzten", "Legend toedliche Unfaelle")) %>%
      addSearchOSM(options=searchOptions(collapsed = FALSE, zoom = 9))
  })
  
  
  
  
  observe({
    leafletProxy("map", data=level_data()) %>% clearGroup(group="Entwicklung toedliche Unfaelle") %>%
      addPolygons(data=level_data(), col=pal_leaf_fatal(level_data()$fatal_rating), group="Entwicklung toedliche Unfaelle", label=level_data()$GEN,
                  layerId=level_data()$AGS) %>%
      clearGroup(group="Entwicklung Unfaelle mit Schwerstverletzten") %>%
      addPolygons(data=level_data(), layerId =level_data()$AGS, col=pal_leaf_heavy(level_data()$heavy_rating), label=level_data()$GEN, group="Entwicklung Unfaelle mit Schwerstverletzten")
    
    
  })
  
  
}

shinyApp(ui=ui,server=server)
r shiny r-leaflet
1个回答
0
投票

最简单、最干净的答案似乎是避免在闪亮的应用程序中使用 baseLayerGroups。所以我只是使用一个额外的单选按钮来在致命事故和重伤事故之间切换。 在传单代理中,我使用 ifelse 语句,根据用户输入显示死亡和重伤地图。

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