带有条件逻辑的 Shiny Leaflet 地图不呈现初始地图标记
Shiny Leaflet map with conditional logic doesn't render initial map markers
我正在使用 Shiny 和 Flexdashboard 构建 Leaflet 地图。使用条件面板将地图隐藏在介绍文本后面。它在用户从输入中进行选择后首次加载。
最初的 output$map
应该只加载一次(由于不需要重新加载的大多边形图层),但是地图标记应该在用户输入更改时更新。
第一次加载地图时,不会加载标记。如果地图加载后输入发生变化,则标记会正确加载。 我的目标是在第一次选择后加载地图标记。
我没有在 output$map
中包含 addCircleMarkers
,因为我不希望每次用户输入/反应变量更改时加载完整地图——多边形和所有内容。
经过大量挖掘,我找到了 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')
)))
```
我没有使用观察者,而是将地图标记定义为输出:
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')
)))
似乎是一个不完美的解决方案,但现在可以使用。
我正在使用 Shiny 和 Flexdashboard 构建 Leaflet 地图。使用条件面板将地图隐藏在介绍文本后面。它在用户从输入中进行选择后首次加载。
最初的 output$map
应该只加载一次(由于不需要重新加载的大多边形图层),但是地图标记应该在用户输入更改时更新。
第一次加载地图时,不会加载标记。如果地图加载后输入发生变化,则标记会正确加载。 我的目标是在第一次选择后加载地图标记。
我没有在 output$map
中包含 addCircleMarkers
,因为我不希望每次用户输入/反应变量更改时加载完整地图——多边形和所有内容。
经过大量挖掘,我找到了 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')
)))
```
我没有使用观察者,而是将地图标记定义为输出:
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')
)))
似乎是一个不完美的解决方案,但现在可以使用。