如何将带有参数的子文档编织到主 RMarkdown 文档中?

How do I knit child documents with parameters into a main RMarkdown document?

提问人:Rob Creel 提问时间:1/11/2022 更新时间:11/17/2023 访问量:1835

问:

我有一个参数化的 RMarkdown 文件,其中包含以下内容。parameterized.Rmd

---
title: "Parameterized report"
output: html_document
params:
  input_df: NULL
---
```{r sec1}
head(params$input_df[, 1:2])
```

我可以从控制台使用 ,为不同的数据帧输入生成不同的文档。这按预期工作。rmarkdown::render

rmarkdown::render("parameterized.Rmd", 
                params = list(input_df = mtcars), 
                output_file = "cars.html")

rmarkdown::render("parameterized.Rmd", 
                  params = list(input_df = iris), 
                  output_file = "iris.html")

我希望这些结果中的每一个都是公共文档的子文档。我的第一次尝试是 ,但它不作为论据。所以这失败了。knitr::knit_childparams

---
title: "Main report"
output: html_document
---


```{r test-cars}
knitr::knit_child("parameterized.Rmd", envir = environment(), quiet = T,
                  params = list(input_df = mtcars))
```

如何将需要参数的子文档编织在一起?

r-markdown 参数传递 knitr

评论


答:

12赞 Rob Creel 1/13/2022 #1

什么对我有用(一旦我正确理解了它,就会从文档中得出)。

不要使用 YAML 标头中的字段,而是设置主文档中的参数值并调用 的输出。以下文件达到了预期的结果。paramscatknitr::knit_child

参数。RMD的

---
title: "Parameterized report"
output: html_document
---

```{r}
head(df[, 1:2])
```

主要。RMD的

---
title: "Main report"
output: html_document
---

# mtcars
```{r mtcars, echo=FALSE, results='asis'}
df <- mtcars 
cat(
  knitr::knit_child('parameterized.Rmd', envir = environment(), quiet = TRUE)
  )
```

# iris
```{r iris, echo=FALSE, results='asis'}
df <- iris 
cat(
  knitr::knit_child('parameterized.Rmd', envir = environment(), quiet = TRUE)
  )
```

Knitting 将参数化报表应用于每个数据帧。main.Rmd

0赞 Monkj_ 11/16/2023 #2

如果您在手动添加变量的子环境中运行子文档,则实际上也可以“覆盖”子文档中的参数。看起来子文档中 YAML 中设置的参数不会被使用,如果你 .所以这应该有效:paramsknitr::knit_child()

参数。RMD的

---
title: "Parameterized report"
output: html_document
params:
  input_df: NULL
---

```{r sec1}
head(input_df[, 1:2])
```

主要。RMD的

---
title: "Main report"
output: html_document
---

# mtcars
```{r mtcars, echo=FALSE, results='asis'}
e1 <- new.env()
e1$params$input_df <- mtcars

cat(
  knitr::knit_child('parameterized.Rmd', envir = e1, quiet = TRUE)
  )
```

# iris
```{r iris, echo=FALSE, results='asis'}
e2 <- new.env()
e2$params$input_df <- iris 

cat(
  knitr::knit_child('parameterized.Rmd', envir = e2, quiet = TRUE)
  )
```

结果非常相似。但是,子报表现在将在子环境中进行评估。如果要使子报表中的变量在主报表中可用,则必须通过“<<-”进行设置。像这样,你的全局环境就不会被你可能不需要的变量所淹没。我将其用于子报告,也可以作为独立版本编织:

SeparateReport.Rmd

---
title: "Separate Report"
output: html_document
params:
  fullprint: TRUE
---

```{r, eval=fullprint}
# do this only if knitting the full version is intended
...

```

```{r}
# always include this chunk
...
some_var <<- some_local_result
```

主.Rmd

---
title: "Main Report"
output: html_document
---

```{r child1}
e <- new.env()
e$params$fullprint <- FALSE

knitr::knit_child("SeparateReport.Rmd", envir = e)
print(some_var)
```

或者,您可以从主文件传递参数

主.Rmd

---
title: "Main Report"
output: html_document
params:
  fullprint: FALSE
---

```{r child1}
knitr::knit_child("SeparateReport.Rmd")
print(some_var)
```