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

在pagedown Rmarkdown中屏蔽ceramic包的下载提示信息

解决pagedreport中ceramic提示屏蔽及地图显示问题

问题背景

通过循环裁剪要素,使用ceramic包下载底图并结合tmap生成地图时,普通Rmarkdown的HTML/PDF输出可通过{r map, results = 'hide', fig.keep='all'}屏蔽ceramic的"Preparing to download..."提示,且地图能正常显示。但切换为pagedreport的paged_windmill输出时,该方法失效,地图无法显示,尝试suppressWarnings()等包裹代码、设置options(warn=-1)均无效果。

可行解决方案

方案1:用capture.output()强制捕获ceramic输出

ceramic的下载提示属于底层控制台输出,suppress系列函数无法完全拦截,capture.output()可以直接捕获并丢弃这类输出,避免干扰pagedreport的渲染流程。

修改后的循环代码:

{r individual-maps, echo=FALSE, error=TRUE, message=FALSE, warning=FALSE, results='hide', fig.keep='all'}

#get practice shapefile
nc <- sf::read_sf(system.file("shape/nc.shp", package="sf"))

unique_county_names <- c("Ashe", "Alleghany", "Surry") 

#set Mapbox API key for the session
Sys.setenv(MAPBOX_API_KEY = "your-api-key")

for (i in 1:length(unique_county_names)) {
  county <- filter(nc, NAME == unique_county_names[i])
  
  # 用capture.output捕获并丢弃ceramic的下载提示
  basemap <- NULL
  capture.output(
    basemap <- ceramic::cc_location(
      loc = extent(sf::st_transform(county, 4326)),
      base_url = "https://api.mapbox.com/styles/v1/mapbox/outdoors-v12/tiles/{zoom}/{x}/{y}"
    ),
    type = "message"
  )
  
 county_map <- tm_shape(basemap) +
    tm_rgb() +
    tm_shape(county) +
   tm_polygons()
    
  print(county_map)
}

方案2:提前批量下载底图到本地,循环读取

将所有需要的底图提前下载到本地目录,循环时直接读取本地文件,彻底避免实时下载产生的控制台提示,同时减少渲染时的动态操作,适配pagedreport的渲染机制。

第一步:提前下载底图(隐藏代码块)

{r pre-download, include=FALSE}
nc <- sf::read_sf(system.file("shape/nc.shp", package="sf"))
unique_county_names <- c("Ashe", "Alleghany", "Surry") 
Sys.setenv(MAPBOX_API_KEY = "your-api-key")

# 创建存储目录
dir.create("basemaps", showWarnings = FALSE)

# 批量下载并保存底图
for (name in unique_county_names) {
  county <- filter(nc, NAME == name)
  basemap <- ceramic::cc_location(
    loc = extent(sf::st_transform(county, 4326)),
    base_url = "https://api.mapbox.com/styles/v1/mapbox/outdoors-v12/tiles/{zoom}/{x}/{y}"
  )
  raster::writeRaster(basemap, paste0("basemaps/", name, ".tif"), overwrite=TRUE)
}

第二步:循环读取本地底图生成地图

{r individual-maps, echo=FALSE, error=TRUE, message=FALSE, warning=FALSE, results='hide', fig.keep='all'}

nc <- sf::read_sf(system.file("shape/nc.shp", package="sf"))
unique_county_names <- c("Ashe", "Alleghany", "Surry") 

for (i in 1:length(unique_county_names)) {
  county <- filter(nc, NAME == unique_county_names[i])
  # 读取本地已下载的底图
  basemap <- raster::raster(paste0("basemaps/", unique_county_names[i], ".tif"))
  
 county_map <- tm_shape(basemap) +
    tm_rgb() +
    tm_shape(county) +
   tm_polygons()
    
  print(county_map)
}

方案3:调整代码块图形设备选项

pagedreport依赖chrome_print渲染,默认图形设备可能存在兼容性问题,指定dev='png'并调整dpi参数,确保地图能被正确识别渲染。

修改后的代码块头部:

{r individual-maps, echo=FALSE, error=TRUE, message=FALSE, warning=FALSE, results='hide', fig.keep='all', dev='png', dpi=300}

此方案可配合方案1一起使用,双重保障提示屏蔽和地图显示。

原理说明

  • capture.output()能捕获所有通过message()或直接输出到控制台的内容,比suppress系列函数拦截更彻底,适合处理ceramic这类底层输出。
  • 提前下载底图规避了渲染过程中的网络请求和动态输出,pagedreport对静态文件的读取兼容性更强。
  • 指定图形设备可确保生成的地图格式符合chrome_print的渲染要求,避免因格式不兼容导致地图无法显示。

内容的提问来源于stack exchange,提问作者mil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:10:34