2017-06-12 40 views
1

我正在使用Shiny和Flexdashboard构建Leaflet地图。地图隐藏在使用条件面板的介绍文本后面。它在用户从输入中进行选择后首次加载。带条件逻辑的闪亮传单映射不会呈现初始地图标记

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

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

我不包括addCircleMarkersoutput$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') 
))) 

``` 
+0

请提供'收费列表',... – BigDataScientist

+1

当然,只是增加了一个例子。谢谢。 – Jeff

回答

1

而不是使用观测的,我所定义的地图标记作为输出:

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

然后称为输出小叶后右:

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

看起来像一个不完美的解决方案,但它现在可以工作。