如何在knitr编译时仅保留PDF格式图片并清理PNG文件
解决方案
下面提供两种实现思路,可根据实际需求选择:
方案1:编织完成后自动清理png文件(改动最小)
直接在setup代码块中加入on.exit()触发的清理逻辑即可,这一逻辑会在整个R Markdown编织会话结束时自动执行,无论编织过程是否报错都会运行:
```{r setup, include=FALSE} # 先定义图片存储路径,方便后续清理调用 fig_dir <- here::here( "figures", gsub("\\.Rmd$", "/", basename(knitr::current_input())) ) # 提前注册编织结束后的清理动作,删除路径下所有png文件 on.exit({ png_files <- list.files(fig_dir, pattern = "\\.png$", full.names = TRUE) if (length(png_files) > 0) file.remove(png_files) }, add = TRUE) knitr::opts_chunk$set( echo = TRUE, dev = c("png", "pdf"), fig.path = fig_dir )
> 提示:原配置中的`\\\\`是Windows系统的路径分隔符,替换为`/`可实现跨平台兼容。 ## 方案2:从根源上不生成独立png文件 如果完全不需要本地存储png文件,仅需要html报告里正常显示图片、本地只留存pdf版本,可以修改设备配置,让png仅嵌入html不落地存储: 先安装`magick`包用于格式转换,再修改setup块如下: ```r ```{r setup, include=FALSE} knitr::opts_chunk$set( echo = TRUE, dev = "pdf", # 仅生成pdf文件到本地目录 fig.path = here::here( "figures", gsub("\\.Rmd$", "/", basename(knitr::current_input())) ) ) # 注册图形钩子,将pdf转为png嵌入html输出 knitr::knit_hooks$set(plot = function(x, options) { if (knitr::is_html_output()) { # png生成在系统临时目录,不会存入本地figures目录 temp_png <- tempfile(fileext = ".png") magick::image_write(magick::image_read(x), temp_png) x <- temp_png } knitr::hook_plot_md(x, options) })
两种方案的差异:方案1无需额外安装依赖,逻辑简单直观,适合不想改动现有配置的场景;方案2完全不会生成png文件到目标目录,适合需要严格管控本地文件的场景。 内容的提问来源于stack exchange,提问作者teunbrand
相关产品推荐
相关产品推荐

