在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
相关产品推荐
相关产品推荐

