阻止传单地图闪烁动画闪亮

问题描述 投票:0回答:1

我做了一个应用程序,在地图上显示坐标,可以使用sliderInput动画功能进行动画制作。但是,每次地图在两个日期之间切换时,地图会在刷新时闪烁,即使它与底图完全相同。有没有办法防止这种情况发生?

应用示例:

library(tidyverse)
library(leaflet)
library(sf)
library(analyticsSimprintR)
library(shiny)

mapUI <- function(id){
  ns <- NS(id)
  tagList(
    leafletOutput(ns("map")))
}
mapServer <- function(input, output, session, data, dateFetcher){
  output$map <- renderLeaflet({
    leaflet(options = leafletOptions(preferCanvas = TRUE)) %>%
      addProviderTiles(providers$Esri.WorldGrayCanvas, options = providerTileOptions(
        updateWhenZooming = TRUE,      # map won't update tiles until zoom is done
        updateWhenIdle = FALSE           # map won't load new tiles when panning
      )) %>%
      fitBounds(lng1 = min(data$lon),
                lat1 = min(data$lat),
                lng2 = max(data$lon),
                lat2 = max(data$lat))%>%
      addCircles(data = st_as_sf(data[data$date == dateFetcher(),],
                                 coords = c("lon", "lat"),
                                 crs = 4326,
                                 agr = "constant"),
                 weight = 0)
  })
}

localChooserUI <- function(id){
  ns <- NS(id)
  uiOutput(ns('chooser'))
}
dateSlider <- function(input, output, session, data){
  output$chooser <- renderUI({
    ns <- session$ns
    sliderInput(inputId = ns("chosen"),
                "Dates:",
                min = as.Date("2019-01-01","%Y-%m-%d"),
                max = as.Date("2019-04-01","%Y-%m-%d"),
                value=as.Date("2019-01-01"),
                timeFormat="%Y-%m-%d",
                animate = animationOptions(interval = 750, loop = TRUE))
  })

  return(reactive(input$chosen))

}

ui <- fluidPage(
  sidebarPanel('Filters',
               localChooserUI('mapDateSlider')),
  mainPanel(mapUI('newMap'))
)

server <- function(input,output){
  coords <- data.frame(lon = runif(10000, min = 0, max = 10), 
                       lat = runif(10000, min = 0, max = 10),
                       date = sample(seq(as.Date('2019/01/01'), 
                                         as.Date('2019/04/01'), 
                                         by="day"), 
                                     100000, , replace = TRUE))
  dateInput <- callModule(dateSlider, id = 'mapDateSlider', data = coords)
  callModule(mapServer, id = 'newMap', data = coords, dateFetcher = dateInput)

}


shinyApp(ui, server)
r animation shiny leaflet uislider
1个回答
1
投票

找到答案,即使用observe添加点数:

library(tidyverse)
library(leaflet)
library(sf)
library(analyticsSimprintR)
library(shiny)

mapUI <- function(id){
  ns <- NS(id)
  tagList(
    leafletOutput(ns("map")))
}
mapServer <- function(input, output, session, data, dateFetcher){
  output$map <- renderLeaflet({
    leaflet(options = leafletOptions(preferCanvas = TRUE)) %>%
      addProviderTiles(providers$Esri.WorldGrayCanvas, options = providerTileOptions(
        updateWhenZooming = TRUE,      # map won't update tiles until zoom is done
        updateWhenIdle = FALSE           # map won't load new tiles when panning
      )) %>%
      fitBounds(lng1 = min(data$lon),
                lat1 = min(data$lat),
                lng2 = max(data$lon),
                lat2 = max(data$lat))
  })
  observe({
    leafletProxy(mapId = 'map') %>%
    clearMarkers() %>%
    clearShapes() %>%
      addCircles(data = st_as_sf(data[data$date == dateFetcher(),],
                                 coords = c("lon", "lat"),
                                 crs = 4326,
                                 agr = "constant"),
                 weight = 0)})
}

localChooserUI <- function(id){
  ns <- NS(id)
  uiOutput(ns('chooser'))
}
dateSlider <- function(input, output, session, data){
  output$chooser <- renderUI({
    ns <- session$ns
    sliderInput(inputId = ns("chosen"),
                "Dates:",
                min = as.Date("2019-01-01","%Y-%m-%d"),
                max = as.Date("2019-04-01","%Y-%m-%d"),
                value=as.Date("2019-01-01"),
                timeFormat="%Y-%m-%d",
                animate = animationOptions(interval = 750, loop = TRUE))
  })

  return(reactive(input$chosen))

}

ui <- fluidPage(
  sidebarPanel('Filters',
               localChooserUI('mapDateSlider')),
  mainPanel(mapUI('newMap'))
)

server <- function(input,output){
  coords <- data.frame(lon = runif(10000, min = 0, max = 10), 
                       lat = runif(10000, min = 0, max = 10),
                       date = sample(seq(as.Date('2019/01/01'), 
                                         as.Date('2019/04/01'), 
                                         by="day"), 
                                     100000, , replace = TRUE))
  dateInput <- callModule(dateSlider, id = 'mapDateSlider', data = coords)
  callModule(mapServer, id = 'newMap', data = coords, dateFetcher = dateInput)

}


shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.