【问题标题】:Remove specific Layers in R Leaflet删除 R Leaflet 中的特定图层
【发布时间】:2019-09-19 15:41:02
【问题描述】:

我的 shinyApp 由两个区域组成,一个地图和一个图表。 您可以在图表中选择一个区域,该区域将更新地图上与所选图表区域相对应的数据。 所以地图使用了一个observe和一个leafletProxy来添加过滤数据,以便ClearMarkers()删除之前过滤的数据。

问题是:我有一个 overlayGroup 的另一个 MarkersLayer 部分,它可以由 overlayGroupWidget 显示,但它没有显示出来。 为什么?由于 ClearMarkers() 会删除地图上的所有标记(T0New 和 T1New)

所以我想删除特定图层,它们是 T0New 和 MapData。 我尝试了 removeMarker() 和 clearGroup() 但没有成功...

有什么想法吗?

这是我的代码示例,其中包含示例数据:

library(shiny)
library(leaflet)
library(leaflet.extras)
library(tidyverse)
library(sf)



#Create T0New data
lat <- c(49.823, 58.478, 57.478, 45.823)
lng <- c(-10.854,-10.854,2.021,2.02)
date_start_min <- c(125,135,168,149)
T0New <- data.frame(lat,lng)

#Create T1New data
lat <- c(48.956, 56.356, 57.445, 45.253)
lng <- c(-9.762,-8.884,1.971,2.17)
T1New <- data.frame(lat,lng)

ui <- fluidPage(

              leafletOutput("map", height = "50vh"),
              plotOutput("distribPlot", height = "47vh",
                         brush = brushOpts(id = "distribPlot_brush", direction = "x", resetOnNew = FALSE))
  )


server <- function(input, output, session) {



  #filtrer les données par attribut du graphique
  filteredGraphData <- reactive({

    noSelection <- TRUE
    currentlyFiltered <- T0New

    if(!is.null(input$distribPlot_brush)){
      thisSel <- input$distribPlot_brush
      currentlyFiltered <- currentlyFiltered %>% 
        filter(date_start_min >= thisSel$xmin, date_start_min <= thisSel$xmax)
      noSelection <- FALSE
    }
    if(!noSelection){
      return(currentlyFiltered)
    }
  })

  #Sortie map
  output$map <- renderLeaflet({
    leaflet()%>%
      addLayersControl(
        position = "bottomright",
        overlayGroups = "T1New",
        options = layersControlOptions(collapsed = F)
      ) %>% 
      hideGroup("T1New") %>% 
      addProviderTiles(providers$CartoDB.Positron) %>% 
      addCircleMarkers(
        lat = T0New$lat,
        lng = T0New$lng,
        radius = 4,
        color = 'red',
        stroke = FALSE,
        fillOpacity = 1
      )%>%
      addCircleMarkers(
        lat = T1New$lat,
        lng = T1New$lng,
        radius = 5,
        color = 'blue',
        stroke = FALSE,
        fillOpacity = 1,
        group = "T1New"
      )
  })

  observe({
    if(length(filteredGraphData()) > 1){
      mapData <- filteredGraphData()
      mapProxy <- leafletProxy("map", session = session, data = c(mapData, T0New))
      mapProxy %>%
        clearMarkers() %>% 
        addCircleMarkers(
          data = T0New,
          lat = T0New$lat,
          lng = T0New$lng,
          radius = 1,
          color = 'black',
          stroke = FALSE,
          fillOpacity = 1
        ) %>%
        addCircleMarkers(
          data = mapData,
          lat = mapData$lat,
          lng = mapData$lng,
          radius = 4,
          color = 'red',
          stroke = FALSE,
          fillOpacity = 1
        )
    }else{
      mapProxy <- leafletProxy("map", session = session, data = T0New)
      mapProxy %>%
        clearMarkers() %>% 
        addCircleMarkers(
          radius = 4,
          color = 'red',
          stroke = FALSE,
          fillOpacity = 1
        )
    }
  })

  #Sortie graph
  output$distribPlot <- renderPlot({

    distribPlot <- ggplot(T0New,aes(date_start_min)) +
      geom_density(col = "#053144", fill = "#43a2ca", alpha = 0.3, adjust = 0.75)

    return(distribPlot)
  })

}

# Create Shiny app ----
shinyApp(ui = ui, server = server)

【问题讨论】:

  • 你能澄清你的标准吗?您希望在什么时候删除 T0New 和 MapData?我不完全确定你想什么时候看到。
  • 我希望能够通过单击 overlayGroup 小部件中的复选框来查看 T1New 数据。我希望在调用 ClearMarkers() 时删除 T0New 和 MapData。

标签: r shiny r-leaflet


【解决方案1】:

我终于找到了解决方案:它在 clearGroup() 我不知道为什么它一开始就不起作用,她是:

library(shiny)
library(leaflet)
library(leaflet.extras)
library(tidyverse)
library(sf)



#Create T0New data
lat <- c(49.823, 58.478, 57.478, 45.823)
lng <- c(-10.854,-10.854,2.021,2.02)
date_start_min <- c(125,135,168,149)
T0New <- data.frame(lat,lng)

#Create T1New data
lat <- c(48.956, 56.356, 57.445, 45.253)
lng <- c(-9.762,-8.884,1.971,2.17)
T1New <- data.frame(lat,lng)

ui <- fluidPage(

              leafletOutput("map", height = "50vh"),
              plotOutput("distribPlot", height = "47vh",
                         brush = brushOpts(id = "distribPlot_brush", direction = "x", resetOnNew = FALSE))
  )


server <- function(input, output, session) {



  #filtrer les données par attribut du graphique
  filteredGraphData <- reactive({

    noSelection <- TRUE
    currentlyFiltered <- T0New

    if(!is.null(input$distribPlot_brush)){
      thisSel <- input$distribPlot_brush
      currentlyFiltered <- currentlyFiltered %>% 
        filter(date_start_min >= thisSel$xmin, date_start_min <= thisSel$xmax)
      noSelection <- FALSE
    }
    if(!noSelection){
      return(currentlyFiltered)
    }
  })

  #Sortie map
  output$map <- renderLeaflet({
    leaflet()%>%
      addLayersControl(
        position = "bottomright",
        overlayGroups = "T1New",
        options = layersControlOptions(collapsed = F)
      ) %>% 
      hideGroup("T1New") %>% 
      addProviderTiles(providers$CartoDB.Positron) %>% 
      addCircleMarkers(
        lat = T0New$lat,
        lng = T0New$lng,
        radius = 4,
        color = 'red',
        stroke = FALSE,
        fillOpacity = 1,
        group = 'A'
      )%>%
      addCircleMarkers(
        lat = T1New$lat,
        lng = T1New$lng,
        radius = 5,
        color = 'blue',
        stroke = FALSE,
        fillOpacity = 1,
        group = "T1New"
      )
  })

  observe({
    if(length(filteredGraphData()) > 1){
      mapData <- filteredGraphData()
      mapProxy <- leafletProxy("map", session = session, data = c(mapData, T0New))
      mapProxy %>%
        clearGroup('A') %>% 
        addCircleMarkers(
          data = T0New,
          lat = T0New$lat,
          lng = T0New$lng,
          radius = 1,
          color = 'black',
          stroke = FALSE,
          fillOpacity = 1,
          group = 'A'
        ) %>%
        addCircleMarkers(
          data = mapData,
          lat = mapData$lat,
          lng = mapData$lng,
          radius = 4,
          color = 'red',
          stroke = FALSE,
          fillOpacity = 1,
          group = 'reactive'
        )
    }else{
      mapProxy <- leafletProxy("map", session = session, data = T0New)
      mapProxy %>%
        clearGroup('A') %>% 
        addCircleMarkers(
          radius = 4,
          color = 'red',
          stroke = FALSE,
          fillOpacity = 1,
          group = 'A'
        )
    }
  })

  #Sortie graph
  output$distribPlot <- renderPlot({

    distribPlot <- ggplot(T0New,aes(date_start_min)) +
      geom_density(col = "#053144", fill = "#43a2ca", alpha = 0.3, adjust = 0.75)

    return(distribPlot)
  })

}

# Create Shiny app ----
shinyApp(ui = ui, server = server)

【讨论】:

    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多