我有一个参数化的 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))
```
如何将需要参数的子文档组合在一起?
什么对我有用(一旦我正确理解它,就来自文档。):
不要使用 YAML 标头中的
params
字段,而是在主文档中设置参数值并在 cat
的输出上调用 knitr::knit_child
。以下文件达到了预期的结果。
---
title: "Parameterized report"
output: html_document
---
```{r}
head(df[, 1:2])
```
---
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
将参数化报告应用于每个数据帧。
如果您在手动添加
params
变量的子环境中运行子文档,实际上还可以“覆盖”子文档中的参数。如果您knitr::knit_child()
,子文档中的 YAML 中设置的参数似乎不会被使用。所以这应该有效:
---
title: "Parameterized report"
output: html_document
params:
input_df: NULL
---
```{r sec1}
head(input_df[, 1:2])
```
---
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:
---
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
```
---
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)
```
或者可以从主文件传递参数
---
title: "Main Report"
output: html_document
params:
fullprint: FALSE
---
```{r child1}
knitr::knit_child("SeparateReport.Rmd")
print(some_var)
```