【问题标题】:Shiny Leaflet map with conditional logic doesn't render initial map markers具有条件逻辑的闪亮传单地图不会呈现初始地图标记
【发布时间】:2017-06-12 15:28:44
【问题描述】:

我正在使用 Shiny 和 Flexdashboard 构建 Leaflet 地图。该地图使用条件面板隐藏在介绍文本后面。它在用户从输入中进行选择后首次加载。

最初的output$map 应该只加载一次(由于不需要重新加载大型多边形层),但地图标记应该在用户输入发生变化时更新。

第一次加载地图时,它不会加载标记。如果地图加载后输入发生变化,则标记会正确加载。 我的目标是在第一次选择后加载地图标记。

我不将addCircleMarkers 包含在output$map 中,因为我不希望每次用户输入/反应变量更改时都加载完整的地图(多边形和所有)。

经过大量挖掘,我找到了this suggestion,但我很难将答案与我的代码联系起来。也许我离代码太近了,看不到答案。感谢您的帮助。

这是一个精简的例子:

```{r setup, include=FALSE}

library(leaflet)
library(shiny)
library(shinyjs)
library(flexdashboard)
library(dplyr)

chargeslist <- c("Charge One","Charge Two")

chargesdf <- data.frame(chargeslist)

userselects <- reactive({
  if(input$charges != "") {
    charges <- chargesdf[chargesdf$chargeslist %in% input$charges, ]
  } else {
    return(NULL)
  }
})

output$intro <- renderUI({
  HTML("Introduction text")
})

output$map = renderLeaflet({
  leaflet('map') %>% addTiles() %>%
  addProviderTiles('CartoDB.Positron') %>%
  setView(-95.37, 29.75, zoom = 10)
})

outputOptions(output, 'intro', suspendWhenHidden=FALSE)

outputOptions(output, 'map', suspendWhenHidden=TRUE) # unless suspendWhenHidden set to TRUE, it doesn't render markers through the observer

output$stats <- reactive({ !is.null(userselects()) }) # universal controller for conditional panels

observe({
req(input$charges)
leafletProxy("map", data = userselects()) %>%
  clearMarkerClusters() %>%
  addCircleMarkers(lng = ~ Longitude, lat = ~ Latitude, color = "#b20000", radius = 10), clusterOptions = markerClusterOptions())
})

```

Sidebar {.sidebar}
=====================================

```{r}

selectizeInput("charges", "Charges", c("Choose one   " = "", as.character(chargeslist)))

```

Map
=====================================  

Row
-----------------------------------------------------------------------
```{r}

div(style="width:100%; float:left;",
  conditionalPanel(condition = '!output.stats', 
                   uiOutput('intro') 
))

div(style="width:100%;", 
 conditionalPanel(condition = 'output.stats', 
  div(id="",
      class="",
      leafletOutput('map') 
)))

```

【问题讨论】:

  • 请提供chargeslist,...
  • 当然,刚刚添加了一个示例。谢谢。

标签: r shiny flexdashboard r-leaflet


【解决方案1】:

我没有使用观察者,而是将地图标记定义为输出:

output$markers <- renderPlot({
  leafletProxy("map", data = userselects()) %>%
      clearMarkerClusters() %>%
      addCircleMarkers(lng = ~ Longitude, lat = ~ Latitude, 
                       color = "#b20000", radius = 10)
})

然后在leaflet之后调用输出:

div(style="width:100%;",
  conditionalPanel(condition = 'output.stats', 
    div(id="",
    class="",
    leafletOutput('map'),
    plotOutput('markers')
  )))

似乎是一个不完美的解决方案,但它现在可以工作。

【讨论】:

    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 2016-09-05
    • 2020-08-28
    • 2018-07-09
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    相关资源
    最近更新 更多