我正在尝试使用knitr生成一个报告,该报告对数据集的不同子集执行相同的分析.项目包含两个RMD文件:所述第一文件是设置了工作区和该文档的主文档,所述第二文件只包含执行分析的块,并产生相关的数字.
我想要做的是编织主文件,然后为每个数据子集调用第二个文件并将结果包含在单个文档中.下面是一个简单的例子.
主文件:
# My report
```{r}
library(iterators)
data(mtcars)
```
```{r create-iterator}
cyl.i <- iter(unique(mtcars$cyl))
```
## Generate report for each level of cylinder variable
```{r cyl4-report, child='analysis-template.Rmd'}
```
```{r cyl6-report, child='analysis-template.Rmd'}
```
```{r cyl8-report, child='analysis-template.Rmd'}
```
Run Code Online (Sandbox Code Playgroud)
分析-template.Rmd:
```{r, results='asis'}
cur.cyl <- nextElem(cyl.i)
cat("###", cur.cyl)
```
```{r mpg-histogram}
hist(mtcars$mpg[mtcars$cyl == cur.cyl], main = paste(cur.cyl, "cylinders"))
```
```{r weight-histogam}
hist(mtcars$wt[mtcars$cyl == cur.cyl], main = paste(cur.cyl, "cylinders"))
```
Run Code Online (Sandbox Code Playgroud)
问题是knitr不允许使用非唯一的块标签,因此analysis-template.Rmd
第二次调用时编织失败.通过保留未命名的块可以避免此问题,因为将自动生成唯一标签.然而,这并不理想,因为我想使用块标签为导出的图创建信息文件名.
一个潜在的解决方案是使用一个简单的函数,将当前柱面附加到块标签:
```r{paste('cur-label', cyl, sep = "-")}
```
Run Code Online (Sandbox Code Playgroud)
但似乎knitr不会评估块标签位置的表达式.
我还尝试使用修改当前块标签的自定义块钩子: …