我正在嘗試使用knitr生成一份報告,該報告對數據集的不同子集執行相同的分析集。該項目包含兩個Rmd文件:第一個文件是設置工作區和文檔的主文檔,第二個文件僅包含執行分析並生成相關數字的塊。R knitr:可以通過編程修改塊標籤嗎?
我想要做的就是編織主文件,然後它會爲每個數據子集調用第二個文件,並將結果包含在單個文檔中。下面是一個簡單的例子。
主控文檔:
# 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將在塊標籤位置計算表達式。
我也嘗試使用自定義chunk hook是修改了當前塊的標籤:
knit_hooks$set(cyl.suffix = function(before, options, envir) {
if (before) options$label <- "new-label"
})
但改變了塊標籤並不會影響產生地塊的文件名,所以我不認爲knitr正在使用新標籤。
有關如何更改塊標籤,以便可以多次調用同一子文檔的任何想法?或者也許是一個替代策略來實現這一點?
我已經使用了這種方法,但注意到在模板中使用'echo = FALSE'會導致代碼未被處理。你有沒有注意到同樣的行爲? –
**編輯**:我已經使用了這個方法以及** bookdown **包,並注意到在模板中使用'results ='asis''和'echo = FALSE'會導致代碼未被處理。解決方案是讓每個輸出都在一個單獨的代碼塊中。 –