我目前正在使用 R Markdown 使用 ggplot 生成充满图形的 PDF。我的 RMarkdown 的每个块都绘制了不同的图表。但是,我需要帮助来导出在制作每个绘图期间处理的数据。这个想法是,在处理每个块之后,该过程产生的数据将导出到 Excel 工作表中。问题是我可以编写一些代码,例如:
plot <- ggplot(df) +
aes(x = x, y = y) +
geom_col()
processed_data <- plot$data
writexl::write_xlsx(processed_data, "data_from_plot.xlsx", sheet = "plot1")
这样就可以了。问题是我有多个块,在所有块中创建这个过程需要大量工作。有没有更简单的方法来导出所有这些数据?谢谢!
一种可能是使用自定义
knit_print
方法,除了打印绘图之外,还将数据导出到 Excel 工作表。下面的代码基于 R Markdown Cookbook 构建,并使用 openxlsx2
导出到 XL。数据将添加到带有块名称的工作表中,因此需要块标签。另请注意,对于 reprex,我使用临时目录来保存 Excel 文件。
---
title: "Export to XL"
output: pdf_document
date: "2024-08-29"
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(
echo = FALSE,
fig.height = 2
)
```
```{r}
library(ggplot2)
path <- tempdir()
```
```{r}
knit_print.ggplot <- function(x, options, ...) {
file <- "data_from_plot.xlsx"
if (file.exists(file.path(path, file))) {
wb <- openxlsx2::wb_load(file.path(path, file))
wb <- openxlsx2::wb_add_worksheet(wb, sheet = options$label)
wb <- openxlsx2::wb_add_data(wb, x = x$data, sheet = options$label)
openxlsx2::wb_save(wb, file = file.path(path, file))
} else {
openxlsx2::write_xlsx(
setNames(list(x$data), options$label),
file.path(path, file),
overwrite = TRUE
)
}
knitr::normal_print(x, ...)
}
registerS3method(
"knit_print", "ggplot", knit_print.ggplot,
envir = asNamespace("knitr")
)
```
```{r iris}
ggplot(iris) +
aes(x = Sepal.Length, y = Sepal.Width, color = Species) +
geom_point()
```
```{r mtcars}
ggplot(mtcars) +
aes(x = factor(cyl), fill = factor(cyl)) +
geom_bar()
```
```{r check}
list.files(path, "\\.xlsx$")
readxl::excel_sheets(list.files(path, "\\.xlsx$", full.names = TRUE))
```