我使用 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"
?
另一种方法是在每个块中包含以下内容
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")