如何使用 Shiny 和 Leaflet 将 hideGroup 变成 showGroup

How To make hideGroup into showGroup with Shiny and Leaflet

我有一个相当复杂的 Shiny 应用程序,上面有传单地图和许多其他控件。我在下面做了一个非常简化的版本。

我已经将这两个组(一个 addMarker 和一个 addCircles 组)设置为最初不绘制,方法是将两个图层都放在 hideGroup 函数中。然后我 运行 应用程序并在地图复选框的 addLayersControl 中手动打开它们。 addCircles 组的半径由 sliderInput 反应控制,但是,这 运行s hideGroup 再次起作用并且它们没有被绘制,我现在不希望发生这种情况。我希望他们继续策划。

如何从隐藏组开始,通过地图图层控件打开它们来显示它们,然后将新值发送到没有组的 addCirlces 半径,然后切换回隐藏组默认值?

我是否使用 isolate 解决了这个问题,我还没有成功吗?还是我应该采用 if_else 条件方法来调用 showGroup 状态?提前致谢。

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

ui <- fluidPage(
  column(width = 4,
         sliderInput("slt_kam_reach",
                     "KAM",
                     min = 0,
                     max = 50000,
                     step = 1000,
                     value = 5000
         )
         ),
  column(width = 8,
     leafletOutput("lflt_map")
     )
)

kam_data <- data.frame(
  kam_code = c("abc123", "def456"),
  lng = c(18.5, 18.7),
  lat = c(-33.5, -33.7)
)

kam_data_sf <- st_as_sf(
    kam_data,
    coords = c("lng", "lat"),
    crs = "+proj=longlat +datum=WGS84"
  )

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

  output$lflt_map <- renderLeaflet({

    leaflet() %>% 
      addTiles(group = "OSM") %>% 
      addLayersControl(
        overlayGroups = c("KAM",
                          "KAM_reach"),
        options = layersControlOptions(
          collapsed = F
        )
      ) %>% 
      addMarkers(data = kam_data_sf,
                 group = "KAM") %>% 
      addCircles(data = kam_data_sf,
                 group = "KAM_reach",
                 radius = input$slt_kam_reach
                 ) %>% 
      hideGroup("KAM") %>% 
      hideGroup("KAM_reach")

  })
}
shinyApp(ui, server)

我刚刚找到了我改编自 Using UI to turn on data and leaflet display on and off 的解决方案。我会 post 以防其他人发现有用。我从 addLayersControl 中删除了层选项,并提供了与 checkboxinputs 相同的功能,它通过 observe/if else 构造控制 hidegroup/showgroup 的状态。

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


ui <- fluidPage(
  column(width = 4,
         fluidRow(
           sliderInput("slt_kam_reach",
                       "KAM",
                       min = 0,
                       max = 50000,
                       step = 1000,
                       value = 5000
           ),
           fluidRow(
             checkboxInput("chbx_KAM", "chbx_KAM"),
             checkboxInput("chbx_kam_reach", "chbx_kam_reach")
           )
         )
         ),
  column(width = 8,
         leafletOutput("lflt_map")
         )


)

kam_data <- data.frame(
  kam_code = c("abc123", "def456"),
  lng = c(18.5, 18.7),
  lat = c(-33.5, -33.7)
)

kam_data_sf <- st_as_sf(
    kam_data,
    coords = c("lng", "lat"),
    crs = "+proj=longlat +datum=WGS84"
  )

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

  output$lflt_map <- renderLeaflet({

    leaflet() %>% 
      addTiles(group = "OSM") %>% 
      addMarkers(data = kam_data_sf,
                 group = "KAM") %>% 
      addCircles(data = kam_data_sf,
                 group = "KAM_reach",
                 radius = input$slt_kam_reach
                 ) 

  })

  proxy <- leafletProxy("lflt_map")

  observe({
    if (input$chbx_KAM == TRUE) {
      proxy %>% showGroup("KAM")
    } else {
      proxy %>% hideGroup("KAM")
    }
  })

  observe({
    if (input$chbx_kam_reach == TRUE) {
      proxy %>% showGroup("KAM_reach")
    } else {
      proxy %>% hideGroup("KAM_reach")
    }
  })


}
shinyApp(ui, server)

我看到你在我完成我的回答后发布了一个答案。无论如何,它在这里:

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

ui <- fluidPage(
  column(width = 4,
         sliderInput("slt_kam_reach",
                     "KAM",
                     min = 0,
                     max = 50000,
                     step = 1000,
                     value = 5000
         )
         ),
  column(width = 8,
     leafletOutput("lflt_map")
     )
)

kam_data <- data.frame(
  kam_code = c("abc123", "def456"),
  lng = c(18.5, 18.7),
  lat = c(-33.5, -33.7)
)

kam_data_sf <- st_as_sf(
    kam_data,
    coords = c("lng", "lat"),
    crs = "+proj=longlat +datum=WGS84"
  )

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

  output$lflt_map <- renderLeaflet({

    leaflet() %>% 
      addTiles(group = "OSM") %>% 
      addLayersControl(
        overlayGroups = c("KAM",
                          "KAM_reach"),
        options = layersControlOptions(
          collapsed = F
        )
      ) %>% 
      hideGroup("KAM") %>% 
      hideGroup("KAM_reach") %>% 
      fitBounds(min(kam_data$lng),
                min(kam_data$lat),
                max(kam_data$lng),
                max(kam_data$lat))      

  })

  observeEvent(input$slt_kam_reach, {
      leafletProxy("lflt_map") %>% 
          clearGroup("KAM_reach") %>% 
          addMarkers(data = kam_data_sf,
                 group = "KAM") %>% 
          addCircles(data = kam_data_sf,
                 group = "KAM_reach",
                 radius = input$slt_kam_reach
                 )
  })
}
shinyApp(ui, server)

更新

您也可以使用 observe,它可能更整洁:

  observe({
      leafletProxy("lflt_map") %>% 
          clearGroup("KAM_reach") %>% 
          addMarkers(data = kam_data_sf,
                 group = "KAM") %>% 
          addCircles(data = kam_data_sf,
                 group = "KAM_reach",
                 radius = input$slt_kam_reach
                 )
  })