You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rmarkdown::render导出含renderLeaflet的flexdashboard HTML时地图失效求助

解决flexdashboard中renderLeaflet导出HTML后空白的问题

问题原因

你的flexdashboard声明了runtime: shiny,属于Shiny交互式文档,这类文档依赖Shiny后端服务器处理reactive交互逻辑(比如selectInput和renderLeaflet的联动)。直接用rmarkdown::render()生成HTML后双击打开,浏览器仅能加载静态内容,无法启动Shiny后端,导致reactive地图空白;而非交互式leaflet()生成的是静态HTML widget,因此能正常显示。

另外代码里selectInput的初始选项存在语法错误:choices = c(" ", ...)的换行空字符串会导致初始筛选时匹配不到任何数据,这也是地图初始空白的诱因之一。

解决方案

1. 修正代码中的语法错误

把selectInput里的错误空选项替换为正常的空字符串,同时增加空选择时的逻辑处理,避免地图无数据:

selectInput("Name", label = "Select City",
            choices = c("", unique(as.character(cities_data$Name))),
            selected = "",
            width = "100%")

2. 正确运行/导出交互式文档

带runtime: shiny的flexdashboard不能像静态HTML一样直接双击打开,需要通过Shiny服务器加载:

  • 方式一:用rmarkdown::run()直接运行Rmd文件,运行后点击页面右上角"Save as HTML"导出,导出文件需用以下代码启动:
    shiny::runFile("your_dashboard.html")
    
  • 方式二:用rmarkdown::render()生成文件后,通过Shiny加载:
    rmarkdown::render(input = "your_dashboard.Rmd", output_file = "your_dashboard.html")
    # 启动Shiny服务器加载导出的HTML
    shiny::runFile("your_dashboard.html")
    
  • 方式三:如果需要分发可独立运行的版本,可使用RStudio的"Publish"功能部署到Shiny Server、ShinyApps.io,或打包成桌面应用。

修正后的完整代码

---
title: "Project Dashboard"
output:
  flexdashboard::flex_dashboard:
    orientation: columns
runtime: shiny
---

```{r setup}
library(tidyverse)
library(sf)
library(leaflet)
library(flexdashboard)
library(shiny)
# Create the data
cities_data <- data.frame(
  Name = c("City A", "City B", "City C"),
  Latitude = c(40.7128, 34.0522, 51.5074),   
  Longitude = c(-74.0060, -118.2437, -0.1278)
) %>% 
  st_as_sf(coords = c("Longitude", "Latitude")) %>% 
  st_set_crs(4326)

Column {data-width=100}

selectInput("Name", label = "Select City",
            choices = c("", unique(as.character(cities_data$Name))),
            selected = "",
            width = "100%")

Column {.tabset .tabset-fade}

Individual Cities

# Reactive leaflet map
renderLeaflet({
  # 处理空选择的情况,默认显示所有城市
  filtered_data <- if(input$Name == "") {
    cities_data
  } else {
    cities_data %>% filter(Name == input$Name)
  }
  
  leaflet() %>%
    addProviderTiles(providers$Esri.WorldImagery,
                     group = "Esri.WorldImagery") %>%
    addCircleMarkers(data = filtered_data,
                     color = "blue")
})

All Cities

## Leaflet map (non-reactive)
Map <- leaflet(data = cities_data) %>% 
  addProviderTiles(providers$Esri.WorldTopoMap)  %>%
  addCircleMarkers(color = "red") 
Map
内容的提问来源于stack exchange,提问作者jdev
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:43:17