Как обновить блестящий реактив только в том случае, если порог пройден? - PullRequest
0 голосов
/ 17 октября 2018

В приведенном ниже коде листовка addCircles отрисовывается дважды после изменения масштаба.Я думаю, что это двойное построение происходит потому, что реактив для создания кадра данных всегда обновляется с изменением масштаба.Однако я хочу, чтобы реактивный информационный фрейм (race.dots.all.r) обновлялся только при превышении порога масштабирования.Есть идеи?

РЕДАКТИРОВАТЬ: я удалил еще больше кода для упрощения и сделал его воспроизводимым, добавив ссылку на раскрывающийся список данных.

library(shiny)
library(leaflet)
library(dplyr)

load(url("https://www.dropbox.com/s/umhqvoqvbhlkrc6/shiny_app_seg_gap_stackoverflow.RData?dl=1"))

ui <- shinyUI(fluidPage(
  leafletOutput("map"),
  checkboxInput("togglewhite",  "White", value = TRUE)
                            ))


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

  per.person <- eventReactive(input$map_zoom,{

    new_zoom <- 12
    if (!is.null(input$map_zoom)) {
      new_zoom <- input$map_zoom}

    if ( new_zoom < 13 ) {
      per.person <- "1000"
    } else {
      per.person <- "250"
    }

    return(per.person)

  })

  race.dots.all.r <- eventReactive(per.person(),{
    race.dots.all <- race.dots.all[[per.person()]]
    return(race.dots.all)
  })


  values <- reactiveValues(school = NULL)

  output$map <- renderLeaflet({

    leaflet(options = leafletOptions(preferCanvas = TRUE)) %>% 
      addProviderTiles("CartoDB") %>%
      setView(lat=40.73771, lng=-74.18958, zoom = 8)
  })


  observeEvent(c(input$togglewhite, race.dots.all.r()), {

    proxy <- leafletProxy('map')
    proxy %>% clearGroup(group = "White")
    if (input$togglewhite){
      race.dots.all.selected.race <- dplyr::filter( race.dots.all.r(), group == "White")
      proxy %>% addCircles(group = race.dots.all.selected.race$group, 
                           race.dots.all.selected.race$lng, 
                           race.dots.all.selected.race$lat)
    }
  },ignoreInit = TRUE)

}) # close server

shinyApp(ui, server)

1 Ответ

0 голосов
/ 17 октября 2018

Если я правильно понимаю ваше требование, то вот один из способов сделать это.Для этого примера я установил порог масштабирования 0, чтобы его можно было легко продемонстрировать.Вы можете изменить его на 4 для вашего приложения.

library(shiny)
library(leaflet)

shinyApp(
  ui = fluidPage(
    leafletOutput("map")
  ),
  server = function(input, output, session) {
    output$map <- renderLeaflet({
      leaflet() %>%
        addTiles()
    })

    map_proxy <- leafletProxy("map")

    observeEvent(input$map_zoom, {
      if(input$map_zoom > 0) {
        map_proxy %>%
          addCircleMarkers(lng = 74.0060, lat = 40.7128,
                           group = "high_zoom_in", radius = 50, color = "red")
      } else {
        map_proxy %>%
          clearGroup("high_zoom_in")
      }
    })
  }
)
...