Как предотвратить повторное центрирование карты Shiny Leaflet при каждом изменении виджета элемента управления - PullRequest
1 голос
/ 03 апреля 2020

Я делаю карту Shiny Leaflet, которая показывает набор рек с данными о качестве воды по месяцам. Ниже приведен мой код сервера для рендеринга листовки. Я хотел бы изменить его, чтобы карта не перерисовывалась и не перецентрировалась каждый раз, когда пользователь изменяет виджет управления месяцами. Я не могу понять, как это сделать. Я попытался поместить оператор setView в предложение if (), используя глобальную переменную, которая отслеживает, является ли это первым запуском, но я получаю ошибки. Я попытался полностью удалить оператор setView, но карта по-прежнему перенаправляет aws к границам рек и данных по умолчанию.

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput(inputId = "month",
        label = "Month (March-November)",
        min = 3, max = 11,
        step = 1, ticks = FALSE,
        value = 9)
    )
    mainPanel(
      leafletOutput("map", width = "100%", height = 480)
    )
  )
)

server <- function(input, output){       
    output$map <- renderLeaflet({
        map <- leaflet(DFA()) %>% addProviderTiles(providers$Esri.WorldGrayCanvas) %>%
          setView(-71.46, 42.42, zoom = 10) %>%
          addPolylines(data = majStrm, color = "blue",
                       weight = 2, smoothFactor = 1) %>%
          addCircleMarkers(lng = ~Lon, lat = ~Lat,
                           fillColor = ~pal(DFA()[,7]), 
                           fillOpacity = 0.9,
                           radius = 6, 
                           stroke = TRUE, weight = 1, 
                           color = "black", opacity = 1)
        map
      })
}

1 Ответ

0 голосов
/ 03 апреля 2020

Это нормальное поведение. renderLeaflet строит новую карту каждый раз, когда она запускается встроенным реактивным значением. Что вам нужно сделать, это использовать функцию leafletProxy.

Используйте простой observer, чтобы нарисовать исходную карту, используя leaflet(), затем используйте observeEvent, вызванный DFA() и используя leafletProxy("map") вместо leaflet() для обновления карты вместо ее воссоздания.

# create static part of map
output$map <- renderLeaflet({
  leaflet() %>%
    ... whatever to build base map ...
    ... without reactive part ...  
})

# handle the update of the static map with reactive part
observe({
  # update map
  leafletProxy("map", data=DFA()) %>%
     clearMarkers() %>%
     addCircleMarkers(...)
})
...