R编织:可以以编程方式修改块标签?

R编织:可以以编程方式修改块标签?

我正在尝试使用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不允许非唯一的块标签,所以当第二次调用analyze 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正在使用新的标签。


关于如何改变块标签的任何想法,所以可以多次调用相同的子文档? 还是替代策略呢?

采纳答案:

对于遇到这个帖子的任何人,我想指出,@iihui通过knit_expand()函数,在knitr 1.0中为这个问题提供了一个正式的解决方案 。 它的工作很好,真的简化了我的工作流程。

例如,以下将为每个级别的mtcars$cyl处理以下模板脚本,每次使用其当前值替换{{ncyl}} (在模板中)的所有实例:

# My report

```{r}
data(mtcars)
cyl.levels <- unique(mtcars$cyl)
```

## Generate report for each level of cylinder variable
```{r, include=FALSE}
src <- lapply(cyl.levels, function(ncyl) knit_expand(file = "template.Rmd"))
```

`r knit(text = unlist(src))`

模板:

```{r, results='asis'}
cat("### {{ncyl}} cylinders")
```

```{r mpg-histogram-{{ncyl}}cyl}
hist(mtcars$mpg[mtcars$cyl == {{ncyl}}], 
  main = paste({{ncyl}}, "cylinders"))
```

```{r weight-histogam-{{ncyl}}cyl}
hist(mtcars$wt[mtcars$cyl == {{ncyl}}], 
  main = paste({{ncyl}}, "cylinders"))
```

参考更多解答:R编织:可以以编程方式修改块标签?,转载请保留R编织:可以以编程方式修改块标签?

更多:knitr