Фильтрация данных карты листовок в блестящем

У меня проблемы с настройкой этого блестящего листа с картой-буклетом. В моем исходном сообщении было два вопроса, и было предложено Я должен начать новое сообщение, чтобы решить мою вторую проблему: как мне заставить карту отображать мои обновленные данные после фильтрации по скорости; моя таблица обновляется независимо от того, меняю ли я «скорость» или границы карты, но карта листовок не обновляет точки на основе входных данных фильтра скорости.

ВОСПРОИЗВОДИМЫЙ КОД

library(shiny)
library(magrittr)
library(leaflet)
library(DT)

ships <-
  read.csv(
    "https://raw.githubusercontent.com/Appsilon/crossfilter-demo/master/app/ships.csv"
  )

ui <- shinyUI(fluidPage(
  titlePanel("Filter"),
  sidebarLayout(
    sidebarPanel(width = 3,
                 numericInput(
                   "speed_f", label = h5("Ship's Speed"), value = 100
                 )),
    mainPanel(tabsetPanel(
      type = "tabs",
      tabPanel(
        "Leaflet",
        leafletOutput("leafletmap", width = "350px"),
        dataTableOutput("tbl")
      )
    ))
  )
))

server <- function(input, output) {
  in_bounding_box <- function(data, lat, long, bounds, speed) {
    data %>%
      dplyr::filter(
        lat > bounds$south &
          lat < bounds$north &
          long < bounds$east & long > bounds$west & 
          speed > input$speed_f
      )
  }

  output$leafletmap <- renderLeaflet({
    leaflet() %>%
      addProviderTiles("Esri.WorldImagery", group = "ESRI World Imagery") %>%
      addCircleMarkers(
        data = ships,
        ~ long ,
        ~ lat,
        popup =  ~ speed,
        radius = 5 ,
        stroke = FALSE,
        fillOpacity = 0.8,
        popupOptions = popupOptions(closeButton = FALSE)
      )
  })

  data_map <- reactive({
    if (is.null(input$leafletmap_bounds)) {
      ships
    } else {
      bounds <- input$leafletmap_bounds
      in_bounding_box(ships, lat, long, bounds, speed)
    }
  })

  output$tbl <- DT::renderDataTable({
    DT::datatable(
      data_map(),
      extensions = "Scroller",
      style = "bootstrap",
      class = "compact",
      width = "100%",
      options = list(
        deferRender = TRUE,
        scrollY = 300,
        scroller = TRUE,
        dom = 'tp'
      )
    )
  })


}

shinyApp(ui = ui, server = server)

ОБНОВЛЕНИЕ

Внесение следующего изменения data = data_map(), похоже, работает, за исключением:

  output$leafletmap <- renderLeaflet({
    leaflet() %>%
      addProviderTiles("Esri.WorldImagery", group = "ESRI World Imagery") %>%
      addCircleMarkers(
        data = data_map(), #### THIS LINE HAS CHANGED
        ~ long ,
        ~ lat,
        popup =  ~ speed,
        radius = 5 ,
        stroke = FALSE,
        fillOpacity = 0.8,
        popupOptions = popupOptions(closeButton = FALSE)
      )
  })

Однако карта-буклет не позволяет мне уменьшить масштаб области, определенной отфильтрованными точками. Это можно обойти?


person val    schedule 02.05.2018    source источник


Ответы (1)


Если вы определяете реактивный элемент только для данных карты и используете его в renderLeaflet, он должен позволить вам затем выйти из определенных. Вам не нужно изменять какие-либо другие ваши функции или реактивы, просто добавьте новый реактив и внесите пару изменений в renderLeaflet, как показано ниже.

map_data_react <- reactive({

    ships %>% dplyr::filter(speed > input$speed_f)

})


output$leafletmap <- renderLeaflet({

    ships_data <- map_data_react()  # Add this

    ships_data %>% leaflet() %>%
      addProviderTiles("Esri.WorldImagery", group = "ESRI World Imagery") %>%
      addCircleMarkers(
          ~ long ,  # Removed `data = data_map()`
          ~ lat,
          popup =  ~ speed,
          radius = 5 ,
          stroke = FALSE,
          fillOpacity = 0.8,
          popupOptions = popupOptions(closeButton = FALSE)
  )
})
person Relasta    schedule 02.05.2018
comment
отлично. Спасибо. Есть ли способ избежать перерисовки карты до пределов отфильтрованных данных скорости (например, если я увеличиваю область и изменяю значение скорости, она перерисовывается до пределов отфильтрованных данных, тогда как я просто хочу перерисовать отфильтрованные данные данные в этих пределах). - person val; 03.05.2018