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

如何在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
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:39:02