Shiny中的Leaflet:在Firefox中使用搜索插件时,不会在应用初始化时绘制点

时间:2017-02-09 23:18:09

标签: r shiny leaflet

我有一个闪亮的应用程序,我想在传单地图上绘制CircleMarkers。此外,应绘制标记,并在overlayGroup上进行控制。当缩放级别大于7时,应绘制标记,否则不绘制标记。这是通过将代码发送到服务器并获取标记的索引来完成的。另见:Show layer in leaflet map in Shiny only when zoom level > 8 with LayersControl?

它运行正常,但是当我从leaflet.extras添加addSearchOSM插件时,应用程序启动时不会再绘制CircleMarkers。因此,在更改输入之前,不会呈现observe语句。

这是代码:

library(leaflet)
library(leaflet.extras)
library(shiny)

data <- data.frame(longitude = c(11.43, 11.55), latitude = c(48, 48.5), label = c("a", "b"))

getInputwithJS <- '
Shiny.addCustomMessageHandler("findInput",
function(message) {
var inputs = document.getElementsByTagName("input");
console.log(inputs);
Shiny.onInputChange("marker1", inputs[1].checked);
}
);
'

ui <- fluidPage(
  sidebarPanel(
    selectInput("label", "label", selected = "a", choices = data$label)
  ),
  mainPanel(
    leafletOutput("map", width = "100%", height = "700"),
    tags$head(tags$script(HTML(getInputwithJS)))
  )
)

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

  # subset data according to label input
  data_subset <- reactive({
    data[data$label %in% input$label, ]
  })

  output$map <- renderLeaflet({
    leaflet() %>% addTiles() %>% setView(11, 48.5, 7) %>% 
      addLayersControl(overlayGroups = c("marker1"),
                       options = layersControlOptions(collapsed = FALSE)) %>%
      addSearchOSM()
  })

  # does not show points when app starts
  observe({
      leafletProxy("map") %>% clearGroup("points") %>%
        addCircleMarkers(data_subset()$longitude, data_subset()$latitude, group = "points")
    })

  global <- reactiveValues(DOMRdy = FALSE)
  autoInvalidate <- reactiveTimer(1000)

  observe({
    autoInvalidate()
    if(global$DOMRdy){
      session$sendCustomMessage(type = "findInput", message = "")
    }
  })

  session$onFlushed(function() {
    global$DOMRdy <- TRUE
  })

  # add marker if marker is clicked in layerscontrol and zoom level of map > 7
  observe({
    if (!is.null(input$marker1)){
      if (input$marker1 == TRUE){
        if (input$map_zoom > 7) {
          leafletProxy("map") %>% addMarkers(lng = 11.2, lat = 48, group = "marker1")
        }else{
          leafletProxy("map") %>% clearGroup(group = "marker1")
        }
      }
    }
  })
}

shinyApp(ui, server)

0 个答案:

没有答案