【问题标题】:How to update shiny reactive only if threshold is crossed?仅当超过阈值时如何更新闪亮的反应?
【发布时间】:2018-10-17 15:36:19
【问题描述】:

在下面的代码中,小册子 addCircles 在缩放更改后被绘制了两次。我认为这种双重绘图的发生是因为创建数据框的反应总是随着缩放的变化而更新。但是,我只希望在超过缩放阈值时更新反应数据框(race.dots.all.r)。有任何想法吗?

编辑:我删除了更多代码以简化并通过向数据添加 Dropbox 链接使其可重现。

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)

【问题讨论】:

  • 为什么绘制的数据首先依赖于缩放?您是否特别打算仅在用户放大/缩小到一定程度时才绘制某些内容?
  • @Shree:第一次绘制数据时,不需要依赖缩放。但是,如果用户缩小我希望显示的点更少。这是为了 (a) 使其绘图速度更快,以及 (b) 更改可视化效果,使点不会相互重叠。与 (b) 相关,我计划在缩小时更改权重,以便 circleMarkers 也发生变化。

标签: r shiny leaflet react-leaflet r-leaflet


【解决方案1】:

如果我正确理解您的要求,那么这是一种方法。为了便于演示,我将本示例的缩放阈值设置为 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")
      }
    })
  }
)

【讨论】:

  • 感谢@Shree 的快速响应。但是,我看不出这将如何与其他需要 addCircles 的观察事件一起工作,具体取决于 checkboxInput 状态(并且 addCircleMarkers/addAwesomeMarkers 需要同时工作)。知道这将如何工作吗?
  • 你的代码对我来说太多了。如果您可以将其减少到代表您的问题的最低限度,那将会有所帮助。
  • 我简化了原始帖子中的代码,并通过从 Dropbox 加载数据使其可重现。谢谢!
  • 我刚刚意识到它不能完全重现,因为 css 文件不可用。在这里,以防万一:dropbox.com/s/s2uytt54su7h0p3/bootstrap.css?dl=1
  • 我通过在 addCircles.现在的问题是初始缩放级别要缩小。也许现在这是一个不同的问题。
猜你喜欢
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2020-12-28
相关资源
最近更新 更多