адаптивная тепловая карта с перекрестными помехами и листовкой в R

#r #leaflet #crosstalk

#r #листовка #перекрестные помехи

Вопрос:

Я хочу создать карту с точками и отзывчивую тепловую карту, используя перекрестные помехи в R. Вот так:

 library(crosstalk)
library(leaflet)
library(DT)

# Wrap data frame in SharedData
sd <- SharedData$new(quakes[sample(nrow(quakes), 10),])

bscols(
  # Create a filter input
  filter_slider("mag", "Magnitude", sd, column=~mag, step=0.1, width=250),
  leaflet(sd) %>% addTiles() %>% addMarkers() %>% addHeatmap())
)
  

Но, как можно заметить после запуска кода, этот способ не дает эффекта реагирования на тепловую карту при фильтрации

Как я могу добиться эффекта?

Ответ №1:

Это можно легко сделать с помощью Shiny. Однако, если вы действительно не хотите использовать перекрестные помехи, вам придется добавить некоторый javascript для перерисовки тепловой карты каждый раз, когда меняются маркеры, поскольку перекрестные помехи по какой-то причине не могут этого сделать.

Рабочий пример можно найти здесь: https://rpubs.com/Jumble/r_crosstalk_leaflet_heatmap_update

Ниже приведен код, который произвел это:

 library(crosstalk)
library(leaflet)
library(leaflet.extras)
library(dplyr)

# Wrap data frame in SharedData
sd <- SharedData$new(quakes[sample(nrow(quakes), 10),])

bscols(widths=c(3,9),
  # Create a filter input
  filter_slider("mag", "Magnitude", sd, column=~mag, step=0.1),
  leaflet(sd) %>% 
    addTiles() %>% 
    addMarkers() %>% 
    addHeatmap(layerId="heatmap") %>%
    removeHeatmap("heatmap") %>%
    htmlwidgets::onRender("
      function(el,x){
        var myMap = this;
        var coord_state;
        var coords;
        
        function get_markers(){
          coord_state = [];
          myMap.eachLayer(function(layer){
            if (typeof layer.options.lat != 'undefined'){
              coord_state.push([layer.options.lat, layer.options.lng, 0.5]);
            }
          })
          return(coord_state)
        }
        
        function update_layer(){
          coords = get_markers()
          heat1.setLatLngs(coords);
          heat1.redraw();
        }
        
        var heat1 = L.heatLayer(get_markers(), {radius: 25}).addTo(myMap);
        myMap.on('layerremove', update_layer);
        myMap.on('layeradd', update_layer);
      }
    "))