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

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

我有一个参数化的 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_child
,但它不以
params
作为参数。所以这次失败了。

---
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 parameter-passing knitr
2个回答
12
投票

什么对我有用(一旦我正确理解它,就来自文档。):

不要使用 YAML 标头中的

params
字段,而是在主文档中设置参数值并在
cat
的输出上调用
knitr::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
投票

如果您在手动添加

params
变量的子环境中运行子文档,实际上还可以“覆盖”子文档中的参数。如果您
knitr::knit_child()
,子文档中的 YAML 中设置的参数似乎不会被使用。所以这应该有效:

参数化.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)
  )
```

结果非常相似。但是,现在将在儿童环境中评估儿童报告。如果您希望子报告中的变量在主报告中可用,您必须通过“<<-". Like this your global environment won't get flushed with variables that you might not need there. I use this for a child report that can also be knitted as a standalone version:

单独报告.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)
```
© www.soinside.com 2019 - 2024. All rights reserved.