【问题标题】:Shiny R clearMarkers() within two observeEvents两个观察事件中的闪亮 R clearMarkers()
【发布时间】:2022-01-17 16:04:14
【问题描述】:

如何在两个不同的observeEvent 中添加两个clearMarkers

以下是一个可重现的示例。该应用程序根据反应函数绘制两组不同的点。反应来自input_gr_letter 的选择。我希望如果用户选择alphaAC 应用程序同时显示AC。由于clearMarkers() 元素,现在只绘制两者中的一个。

我尝试过clearMarkers(data_point())clearMarkers(data_point2()) 之类的方法。

我可以将两者放在同一个 observeEvent 中,如下所示,但我真的想将它们放在两个不同的 observeEvent 中。有什么想法吗?

observeEvent(list(input$input_letter,input$input_letter2, input$input_gr_letter), {
    leafletProxy("map1") %>%
      clearMarkers() %>%
      addMarkers(data = data_point()) %>%
      addMarkers(data = data_point2())
  }, ignoreInit = T) 
library(shiny)
library(shinyWidgets)
library(leaflet)
library(leaflegend)
library(dplyr)
library(sp)
library(raster)
library(rgdal)
library(rgeos)
points <- c("A", "A", "B", "B")
lat <- c(9,10,11,10)
lon <- c(11,10,2,12)
type <- c(alpha= "alpha",beta = "beta",theta = "theta",gamma = "gamma")
df <- data.frame(points,lat,lon,type)

points2 <- c("C", "D")
lat2 <- c(19,20)
lon2 <- c(12,14)
type2 <- c(alpha= "alpha",beta = "beta")
df2 <- data.frame(points2,lat2,lon2,type2)

coordinates(df)<-~lat+lon
proj4string(df) <- CRS("+proj=longlat +datum=WGS84 +no_defs")

coordinates(df2)<-~lat2+lon2
proj4string(df2) <- CRS("+proj=longlat +datum=WGS84 +no_defs")

ui <- bootstrapPage(
  tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
  leafletOutput("map1", width = "100%", height = "100%"),
  absolutePanel(left = 10, bottom = 10, draggable = TRUE, 
                selectInput(inputId = "input_letter", label = "Select Letter",
                            choices = c("A","B")),
                selectInput(inputId = "input_letter2", label = "Select Letter",
                            choices = c("C","D")),
                selectInput(inputId = "input_gr_letter", label = "Select Gr Letter",
                            choices = c("alpha","beta","theta","gamma"),
                            multiple = TRUE)
  ))  

server <- function(input, output, session) {
  
  # Create the map
  output$map1 <- renderLeaflet({
    leaflet(
      option = leafletOptions(attributionControl=FALSE)) %>%
      addTiles() 
  })
  
  data_point <- reactive({
    df[df@data$points == input$input_letter & df@data$type %in% input$input_gr_letter,]
  })
  
  data_point2 <- reactive({
    df2[df2@data$points2 == input$input_letter2 & df2@data$type2 %in% input$input_gr_letter,]
  })
  
  
  # Reactive Map ---------------------------------
  observeEvent(list(input$input_letter, input$input_gr_letter), {
    leafletProxy("map1") %>%
      clearMarkers() %>%
      addMarkers(data = data_point())
  }, ignoreInit = T)

observeEvent(list(input$input_letter2, input$input_gr_letter), {
  leafletProxy("map1") %>%
    clearMarkers() %>%
    addMarkers(data = data_point2())
}, ignoreInit = T)

}


shinyApp(ui, server)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    这里有两个选项:

    • 使用组:在addMarkers中定义一个组,然后清除该组
    • 使用 layerId :在您的数据中定义一个 ID 列(每行一个唯一 ID),在 addMarkers 中定义 layerId = ID,然后用户 removeMarker(ID) 删除您想要的标记。

    我认为第一个选项更适合您的情况,但了解第二个选项也很好。

    组选项代码:

      # Reactive Map ---------------------------------
      observeEvent(list(input$input_letter, input$input_gr_letter), {
        leafletProxy("map1") %>%
          clearGroup("group1") %>%
          addMarkers(data = data_point(), group = "group1")
      }, ignoreInit = T)
      
      observeEvent(list(input$input_letter2, input$input_gr_letter), {
        leafletProxy("map1") %>%
          clearGroup("group2") %>%
          addMarkers(data = data_point2(), group = "group2")
      }, ignoreInit = T)
    

    带有 layerId 的选项代码:

    id1 <- c("id1_1, id1_2, id1_3, id1_4")
    points <- c("A", "A", "B", "B")
    lat <- c(9,10,11,10)
    lon <- c(11,10,2,12)
    type <- c(alpha= "alpha",beta = "beta",theta = "theta",gamma = "gamma")
    df <- data.frame(id1,points,lat,lon,type)
    
    id2 <- c("id2_1, id2_2, id2_3, id2_4")
    points2 <- c("C", "D")
    lat2 <- c(19,20)
    lon2 <- c(12,14)
    type2 <- c(alpha= "alpha",beta = "beta")
    df2 <- data.frame(id2,points2,lat2,lon2,type2)
    

    [....]

     # Reactive Map ---------------------------------
      observeEvent(list(input$input_letter, input$input_gr_letter), {
        leafletProxy("map1") %>%
          removeMarker(df@data$id1) %>%
          addMarkers(data = data_point(), layerId = ~id1)
      }, ignoreInit = T)
      
      observeEvent(list(input$input_letter2, input$input_gr_letter), {
        leafletProxy("map1") %>%
          removeMarker(df2@data$id2) %>%
          addMarkers(data = data_point2(), layerId = ~id2)
      }, ignoreInit = T)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-25
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      相关资源
      最近更新 更多