将所有数据从图表导出到 R Markdown 中的 Excel

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

我目前正在使用 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")

这样就可以了。问题是我有多个块,在所有块中创建这个过程需要大量工作。有没有更简单的方法来导出所有这些数据?谢谢!

r ggplot2 r-markdown export
1个回答
0
投票

一种可能是使用自定义

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))
```

enter image description here

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