渲染许多连接的四开文档

Orl*_*gal 8 r rstudio knitr r-markdown quarto

我一直在尝试 Rstudio 的新四开工具,但似乎我无法做一些在旧版本的R NotebookR Markdown替代品中可以做的事情。

我想通过几个四开文档 (.qmd) 组织我的工作流程,并且我想生成 .html 文档以与非 R 用户共享。例如,假设我有以下 4 个文档:

  • 01_数据处理.qmd
  • 02_统计分析.qmd
  • 03_Plots.qmd
  • 04_报告.qmd

01_DataProcessing.qmd中,我清理并组织了其他三个文件中使用的所有数据。因此,其他三个文件依赖于01_DataProcessing.qmd,必须先运行 *01_DataProcessing.qmd 才能运行其他文件。在 Rstudio 中,这可以完美地工作,因为环境中的所有数据都可以由所有 .qmd 文件访问。

然而,当我想生成 .hmtl 文件时,我必须“渲染” .qmd 文件。这就是我发现问题的地方。渲染似乎忽略了全局环境中的所有变量(以及所有加载的库),因此它显示错误(执行停止)。这意味着我只能使用包含所有代码的独立文档,这对于大型工作流程可能会出现问题。

我错过了什么吗?我需要更改一些设置吗?有什么解决方法吗?如何指定 .qmd 使用全局环境中可用的所有数据?

请注意,将最新版本的 Rstudio 更改为 .rmd 并不能解决问题,因为行为与 .qmd 文档相同。另外,请注意,过去并非如此。

编辑

为了给出一个可重现的示例,假设在第一个qmd文件01_DataProcessing.qmd中,我创建了一个 data.frame并且我想在03_Plots.qmd文件中TestData使用TestData

01_数据处理.qmd

---
title: "01_DataProcessing"
format: html
editor: visual
---

```{r}
library(tidyverse)
library(magrittr)

TestData <- data.frame(
  x = c(1, 2, 3, 4, 5, 6, 7),
  y = c(1 ,2 ,3, 4, 5, 6, 7))
```
Run Code Online (Sandbox Code Playgroud)

03_Plots.qmd

---
title: "03_Plots"
format: html
editor: visual
---

If you try to render the file the execution is halted because the object TestData is not found. 

```{r}
plot(TestData$x, TestData$y)
```
Run Code Online (Sandbox Code Playgroud)

sha*_*fee 4

一种方法可以是将第一个qmd文件中的 r 对象保存在一个.Rdata文件中,然后.Rdata在第二个qmd文档的开头加载该文件,并且还使用包含所有库调用的 R 脚本文件,并将该 r 脚本文件来源为每个文件的开头qmd

现在假设所有这些相关文件都位于同一目录(即文件夹)中,


全局变量R

globals.R文件包含所有必要的库调用,并且可能包含我们希望在每个qmd文件中使用的常见 R 对象(向量、data.frame 等)和常见 R.options,我们将在每个文件的开头获取此 r 脚本文件qmd文件。

library(tidyverse)
library(magrittr)
Run Code Online (Sandbox Code Playgroud)

01_数据处理.qmd

我们将TestData1TestData2data.frame 对象保存在data_process.Rdata文件中,以便我们可以在后面的文件中使用它们。

---
title: "01_DataProcessing"
format: html
---

```{r}
#| label: setup-globals
#| include: false

source("globals.R")
```

```{r}
TestData1 <- data.frame(
  x = c(1, 2, 3, 4, 5, 6, 7),
  y = c(1 ,2 ,3, 4, 5, 6, 7)
  )

TestData2 <- data.frame(
  x = 6:10,
  y = 6:10
  )
```

```{r}
#| include: false

save(TestData1, TestData2, file = "data_process.Rdata")
```
Run Code Online (Sandbox Code Playgroud)

03_Plots.qmd

在此文件中,我们可以加载该data_process.Rdata文件,并且TestData1data.frameTestData2对象可供使用。

---
title: "03_Plots"
format: html
---

```{r}
#| label: setup
#| include: false

source("globals.R")
load("data_process.Rdata")

```

```{r}
plot(TestData1$x, TestData1$y)
plot(TestData2$x, TestData2$y)
```
Run Code Online (Sandbox Code Playgroud)

现在我们可以按顺序渲染这些文件,一切都按预期进行(希望如此!)。

现在添加一些更多建议

  • 如果我们设置一个包含这些文件的 Rstudio 项目,我们可以使用特定于项目的文件,.Rprofile而不是像此答案中那样使用全局 R 文件,这使我们无需在每个文件中获取 r 脚本文件qmd

  • 如果我们只想在顺序文件之间传递 data.frame,我们也可以将这些 data.frame 作为 CSV 文件写入项目目录内的特定数据目录中,并在以后的文件中读取它们(推荐使用该{here}包很多人都遇到过这种情况)