在 R markdown 中,如何防止非缓存块的图被单独保存?

Posted

技术标签:

【中文标题】在 R markdown 中,如何防止非缓存块的图被单独保存?【英文标题】:In R markdown, how do I prevent plots from non-cached chunks from being saved separately? 【发布时间】:2022-01-13 03:44:27 【问题描述】:

在编织 R markdown 文件时,从带有 cache=TRUE 的任何块输出的绘图独立于 html 输出保存。这对我来说很有意义。但是,即使单个块设置了cache=TRUE 选项,所有 块,包括带有cache=FALSE 的块,都将独立保存它们的图。例如,以下代码为两个块保存图像文件:

---
title: "Cache Plot Test"
output:
  html_document:
    df_print: paged
---

```r test_plot1, cache = FALSE
library(ggplot2)
ggplot(airquality, aes(x = Temp, y = Wind)) +
  geom_point()
```

```r test_plot2, cache = TRUE
library(ggplot2)
ggplot(airquality, aes(x = Month, y = Ozone)) +
  geom_point()
```

如果有人想在特定块上实现缓存但又不想独立保存输出中的每一个图,有什么办法可以防止这种情况发生?如果没有这样的选择并且这是设计使然,那么理由是什么?为什么需要从不实现缓存的块中保存绘图?

【问题讨论】:

【参考方案1】:

绘图总是写出到一个文件中。可以看到,对于缓存块,重新编织文档时图像没有被修改,但非缓存块中的图像被重写(检查修改日期)。 R 不会重新运行为缓存块生成图像的代码。如果您没有启用任何缓存,则 rmarkdown 将在运行后“清理”并删除所有图像。但是因为 rmarkdown 不跟踪每个块级别的副作用,所以当启用缓存时,它不能再自行清理,因为它不知道哪些图像来自哪个块。因此,这可以确保他们所有人的安全。

【讨论】:

@MikaelJagan 如果缓存目录存在,则似乎不会进行清理:github.com/rstudio/rmarkdown/blob/…。看起来 rmarkdown 不跟踪哪个图像来自非缓存块,因此如果有任何被缓存,则需要将它们全部保留。 糟糕——我删除了我的评论,因为我决定开始写一个答案(我现在已经放弃了)。我曾要求@MrFlick 在他们的回答中澄清cache 块选项和rmarkdown::renderclean 参数之间的交互。 @MrFlick 我想知道当前的行为是设计的还是偶然的。直观的事情是当clean = TRUE 时,在未缓存的块中生成的图像文件在渲染后被删除。由于图像文件以块名称为前缀,我想 可能 在文件和块之间映射并有条件地删除文件。对于rmarkdown 维护者来说,这似乎是一个合理的问题。 哦,现在正在阅读 rmarkdown/R/render.R 中的 cmets。我想我有我的答案 - 感谢您的链接。

以上是关于在 R markdown 中,如何防止非缓存块的图被单独保存?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止在文本框中粘贴非数值?

如何防止 IIS 7.5 缓存符号链接内容?

knitr Markdown 在 Emacs 中突出显示?

在 Markdown 列表中添加标准代码块的格式

rmarkdown怎么导入package

如何在基于块的 API 方法中使用非空和可为空的 Objective-C 关键字