R语言 仅当缩放超过Shiny中的阈值时渲染瓣叶图

uidvcgyl  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(128)

我已经建立了一个传单Map在一个闪亮的应用程序,显示不同的层取决于什么缩放你有。
我把leafletProxyobserveEvent和leaflet的input$MAPID_zoom结合起来构建了这个。

server <- shinyServer(function(input, output, session) {
  
  output$map <- renderLeaflet({
    leaflet() |> 
      addTiles() |> 
      mapOptions(zoomToLimits="first") |> 
      setView(lat = 47.218637, lng = -1.554136, zoom = 7)
  })
  
  observeEvent(
    eventExpr = input$map_zoom, {
      map_proxy <- leafletProxy(mapId = "map", session = session)
      
        if(input$map_zoom < 8){
          map_proxy |> 
            clearMarkers() |> 
        addMarkers(
          data = df, lng = ~lng, lat = ~lat
        )
        } else {
          map_proxy |> 
            clearMarkers() |> 
          addMarkers(
            data = df_2, lng = ~lng, lat = ~lat
          )
        }
      
    }
  )
})

但是,每次缩放变化时,这都会重新渲染瓣叶图。我想Map只呈现时,在if语句中的阈值被超越。有什么方法可以解决这个问题呢?
UI和数据代码:

library(shiny)
library(leaflet)

df <- data.frame(
  location_name = c('S1', 'S2'),
  lng = c(-1.554136,  -2.10401),
  lat = c(47.218637, 47.218637), 
  stringsAsFactors = FALSE
)

df_2 <- data.frame(
  location_name = c('S3', 'S4'),
  lng = c(-1.654136,  -2.2401),
  lat = c(47.218637, 47.218637), 
  stringsAsFactors = FALSE
)

ui <- shinyUI(
  fluidPage(
    leafletOutput(outputId = 'map')
  )
)
eyh26e7m

eyh26e7m1#

我不能重现你的问题,但这里有一个解决方案。你必须创建两个层和发挥的可见性。

server <- shinyServer(function(input, output, session) {
  
  output$map <- renderLeaflet({
    leaflet() |> 
      addTiles() |> 
      mapOptions(zoomToLimits="first") |> 
      setView(lat = 47.218637, lng = -1.554136, zoom = 7) |>
      addMarkers(
        data = df, lng = ~lng, lat = ~lat, group = "S1S2"
      ) |> 
      addMarkers(
        data = df_2, lng = ~lng, lat = ~lat, group="S3S4")
  })
  
  observeEvent(
    eventExpr = input$map_zoom, {
      map_proxy <- leafletProxy(mapId = "map", session = session)
      
      if(input$map_zoom < 8){
        map_proxy |> 
          showGroup("S1S2") |>
          hideGroup("S3S4")
      } else {
        map_proxy |> 
          showGroup("S3S4") |>
          hideGroup("S1S2")
      }
      
    }
  )
})

在这里,每个层都有一个不同的组ID,根据缩放级别,我们隐藏或显示相应的组。

相关问题