2016-10-23 1 views
1

Обратите внимание, что этот вопрос был размещен at the R Shiny Google Group:Как правильно clearShapes в листовке в Блестящем приложении

После Leaflet for R/ Shiny Integration documentation, я получаю нежелательное/неожиданное поведение с функцией leafletProxy.

В приведенном ниже приложении я ожидаю, что маркеры круга появятся/исчезнут при изменении ввода $ options.

Реактивная df 'filterData', похоже, работает правильно.

Я неправильно использую листовкиProxy() или 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) 

ответ

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) 
+0

Спасибо, но, к сожалению, это исправление не совсем работает. EG, если вы запустите приложение, удалите каждую категорию (A, B, C), а затем повторно добавьте/удалите, вы увидите нежелательное поведение. – WMC

+0

@ user3741038 - Я забыл про «проблему с пустыми данными» - обновил свой ответ – SymbolixAU

+0

Спасибо. Пустое df ... имеет смысл. – WMC

Смежные вопросы