如何将`.Rmd`的所有ggplots保存为`.rds`

问题描述 投票:0回答:1

我使用 Markdown 文档进行分析。我创建了很多图并使用

knitr::opts_chunk$set(dev= c("png", "svg", "pdf")
rmarkdown::render(... , clean = FALSE)
获取png(用于谷歌幻灯片),svg(用于powerpoint)和pdf(包含在手动乳胶报告中)。但是,我现在想将不同分析的绘图合并到图形面板中,同时能够更改绘图大小和纵横比,而无需每次重新运行所有分析。

实现此目的的一种方法是使用分析笔记本中的

.rds
和生成图形面板的单独脚本中的
saveRDS(ggplot2::last_plot(), "figure_1.rds")
将 ggplots 保存在
library(patchwork); readRDS("figure_1.rds") / readRDS("figure_2.rds")
文件中。这可以使用钩子部分自动化:

example_analysis.Rmd

```{r setup}
knitr::opts_chunk$set(dev= c("png", "svg", "pdf")
knitr::knit_hooks$set(hook_save_plot_as_rds = function(before, options, envir, name) {
  if(before) return() # run only after chunk
  if(length(knitr:::get_plot_files())==0) return() # only run if 
  saveRDS(ggplot2::last_plot(), knitr::fig_chunk(knitr::opts_chunk$get("label"), ext = "rds"))
})
```
Here we do some heavy analysis
```{r sepal-plot}
ggplot(iris, aes(Sepal.Width, Sepal.Length)) + geom_point()
```

Here we do some more heavy analysis
```{r petal-plot}
ggplot(iris, aes(Petal.Width, Petal.Length)) + geom_point()
```

其他地方:

library(patchwork)
get_figure <- function(name) readRDS(paste0("example_analysis_files/figure-html/", name, "-1.rds"))
get_figure("petal-plot") / get_figure("sepal-plot") + plot_annotation(tag_levels="A")

但这仅适用于每个块的最后一个 ggplot。有没有一种方法适用于所有块图?难道还有隐藏的

device="rds"

r r-markdown knitr
1个回答
0
投票

另一种方法是在每个块中包含以下内容

plot_label = opts_current$get("label")
saveRDS(ggplot2::last_plot(), paste0(plot_label, ".rds")

这会将绘图对象保存到给定的 RDS。

为了避免重复代码,您可以将其包装在函数中

save_plot <- function() {
  plot_label = opts_current$get("label")
  saveRDS(ggplot2::last_plot(), paste0(plot_label, ".rds")
}

看起来像这样

```{r petal-plot}
ggplot(iris, aes(Petal.Width, Petal.Length)) + geom_point()
save_plot()
```

然后,当您需要可用的绘图时,请使用您选择的方法加载它们,例如使用 使用

list.files(pattern = "*.rds")

© www.soinside.com 2019 - 2024. All rights reserved.