Я пытаюсь использовать 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'}
```
анализ-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"))
```
Проблема заключается в том, что 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 использует новую метку.
Любые идеи о том, как изменить метки ярлыков, чтобы один и тот же дочерний документ можно было вызывать несколько раз? Или, возможно, альтернативная стратегия для этого?