我正在尝试使用 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'}
```
分析模板.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"))
```
问题是 knitr 不允许使用非唯一的块标签,因此analysis-template.Rmd
第二次调用时编织失败。这个问题可以通过不命名块来避免,因为随后会自动生成唯一的标签。然而,这并不理想,因为我想使用块标签为导出的图创建信息文件名。
一个潜在的解决方案是使用一个简单的函数,将当前柱面附加到块标签:
```r{paste('cur-label', cyl, sep = "-")}
```
但似乎 knitr 不会评估块标签位置中的表达式。
我还尝试使用修改当前块标签的自定义块挂钩:
knit_hooks$set(cyl.suffix = function(before, options, envir) {
if (before) options$label <- "new-label"
})
但是更改块标签不会影响生成图的文件名,所以我认为 knitr 没有使用新标签。
关于如何更改块标签以便可以多次调用同一个子文档的任何想法?或者也许是实现这一目标的替代策略?