Как очистить маркеры от карты листовки, добавленной drawToolbar?

#r #r-leaflet

#r #r-листовка

Вопрос:

Как я могу очистить маркеры, которые были добавлены через drawToolbar on leaflet map in shiny ? Если вы добавите маркер, а затем щелкните actionButton , маркер останется на карте. Это ошибка? Я пробовал оба clearMarkers , clearGroup но ни один из них не сработал.

 library(shiny)  
library(leaflet)
library(leaflet.extras)

ui <- fluidPage(
  leafletOutput("map"),
  actionButton("rm", "Remove markers")
)

server <- function(input, output, session) {
  output$map <- renderLeaflet({
    leaflet()  %>% 
      addTiles() %>% 
      addDrawToolbar(targetGroup = "x")
  })
  
  observeEvent(input$rm, {
    leafletProxy('map') %>%
      clearMarkers() %>%
      clearGroup("x")
  })
}
shinyApp(ui, server)
  

Ответ №1:

Панель инструментов является частью output$map объекта, созданного в начале. Чтобы удалить его, вам нужно присвоить новое значение output$map , которое не содержит панели инструментов. Например,

 library(shiny)  
library(leaflet)
library(leaflet.extras)

ui <- fluidPage(
  leafletOutput("map"),
  actionButton("rm", "Remove markers")
)
server <- function(input, output, session) {
  toolbar <- TRUE
  init <- function() renderLeaflet({
    leaf <- leaflet()  %>% addTiles()
    if (toolbar)
      leaf <- leaf %>% 
        addDrawToolbar(targetGroup = "x")
    leaf
  })
  
  output$map <- init()
  
  observeEvent(input$rm, {
    toolbar <<- !toolbar
    output$map <- init()
    leafletProxy('map') %>%
      clearMarkers() %>%
      clearGroup("x")
  })
}
shinyApp(ui, server)
  

Вы должны иметь возможность вызвать removeDrawToolbar() , чтобы избавиться от этого, но в этом коде есть ошибка, с перечисленными некоторыми обходными путями: https://github.com/bhaskarvk/leaflet.extras/issues/148

Комментарии:

1. Спасибо, на самом деле я не хочу удалять drawToolbar, только маркеры, добавленные с помощью панели инструментов, см. Мой ответ ниже.

Ответ №2:

Это решение, которое я придумал:

 library(shiny)  
library(leaflet)
library(leaflet.extras)

ui <- fluidPage(
  leafletOutput("map"),
  actionButton("rm", "Remove markers")
)
server <- function(input, output, session) {
  init <- function() {
    renderLeaflet({
      leaf <- 
        leaflet() %>% 
        addTiles() %>% 
        addDrawToolbar() 
      
      bounds <- isolate({input$map_bounds})
      if (!is.null(bounds)) {
        center <- c("lat" = mean(c(bounds$north, bounds$south)),
                    "lng" = mean(c(bounds$east, bounds$west)))
        
        leaf <- 
          leaf %>% 
          setView(lng = center[["lng"]],
                  lat = center[["lat"]],
                  zoom = isolate({input$map_zoom}))
      }
      
      leaf
    })
  }
  
  output$map <- init()
  
  observeEvent(input$rm, {
    output$map <- init()
  })
}
shinyApp(ui, server)
  

Он перерисовывает карту по actionButton щелчку (спасибо @user2554330 за идею). Если есть решение без перерисовки карты, например, с clearMarkers() помощью функции, мне было бы интересно.