【问题标题】:How to correctly clearShapes in Leaflet in a Shiny app如何在闪亮的应用程序中正确清除传单中的形状
【发布时间】:2016-10-23 20:11:00
【问题描述】:

请注意,此问题已发布at the R Shiny Google Group

Leaflet for R/ Shiny Integration documentation 之后,leafletProxy 函数出现了不需要/意​​外的行为。

在下面的应用程序中,我希望圆圈标记会随着 input$choices 的变化而出现/消失。

反应式 df 'filteredData' 似乎工作正常。

我是否错误地使用了 leafletProxy() 或 clearShapes()?

library(shiny)
library(dplyr)
library(leaflet)


my_df <- data.frame(lat = 34.72 + rnorm(1000, sd = .18), 
                    lng = -92.5 + rnorm(1000, sd = .33), 
                    category = c(rep("A", 300), rep("B", 300), rep("C", 400)))

ui <- bootstrapPage(
  tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
  leafletOutput("map", height = '100%', width = '100%'),
  absolutePanel(top = 10, right = 10, 
                checkboxGroupInput("choices", "Choices", choices =     list("A","B","C"), selected = c("A","B","C")),
                verbatimTextOutput("my_rows")


  )
)


server <- function(input, output) {

  filteredData <- reactive( my_df %>% filter(category %in% input$choices) )

    output$map <- renderLeaflet({ leaflet() %>% addTiles() %>% setView(lat =     34.72, lng = -92.5, zoom = 9) })

    observe({

      leafletProxy("map", data = filteredData()) %>% clearShapes() %>% addCircleMarkers(radius = 6, weight = 1, fillColor = "red", fillOpacity = 0.3)

    })

    output$my_rows <- renderPrint({ filteredData() %>% nrow() })
}

shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny leaflet


    【解决方案1】:

    您的第一个问题已通过使用clearMarkers() 而不是clearShapes() 解决。

    至于您指出的另一个问题,leaflet 与空(和 NA)数据作斗争。当您取消选择所有值时,您的 data.frame 显然会变为空。对此进行简单检查以阻止leaflet 尝试对其进行绘图将解决此问题。

    我在这里使用if - else 做检查。

    library(shiny)
    library(dplyr)
    library(leaflet)
    
    my_df <- data.frame(lat = 34.72 + rnorm(1000, sd = .18), 
                        lng = -92.5 + rnorm(1000, sd = .33), 
                        category = c(rep("A", 300), rep("B", 300), rep("C", 400)))
    
    ui <- bootstrapPage(
        tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
        leafletOutput("map", height = '100%', width = '100%'),
        absolutePanel(top = 10, right = 10, 
                     checkboxGroupInput("choices", "Choices"
                                         , choices = list("A","B","C")
                                         , selected = c("A","B","C")),
                     verbatimTextOutput("my_rows")
        )
    )
    
    server <- function(input, output) {
    
        filteredData <- reactive({ 
            my_df %>% filter(category %in% input$choices) 
            })
    
        output$map <- renderLeaflet({ 
            leaflet() %>% 
                addTiles() %>% 
                setView(lat = 34.72, lng = -92.5, zoom = 9) 
            })
    
        observe({
    
            df <- filteredData()
    
            ## check for empty dataframe
            if(nrow(df) == 0){
                leafletProxy("map", data = df) %>% 
                clearMarkers()
            }else{
                leafletProxy("map", data = df) %>% 
                    clearMarkers() %>% 
                    addCircleMarkers(radius = 6, weight = 1
                                     , fillColor = "red", fillOpacity = 0.3)
            }
    
        })
    
        output$my_rows <- renderPrint({ 
            filteredData() %>% 
                nrow() 
            })
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 谢谢您,但不幸的是,此修复程序不太奏效。例如,如果您运行应用程序,删除每个类别(A、B、C),然后重新添加/删除,您会看到不需要的行为。
    • @user3741038 - 我忘记了“空数据问题” - 已更新我的答案
    • 谢谢。空 df... 是有道理的。
    • 进一步提示:如果你有一个addMarkersclusterOptions,你可以使用clearMarkerClusters() 而不是clearMarkers()
    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多