【问题标题】:Compile multiple instances of SAME markdown into ONE pdf将 SAME markdown 的多个实例编译成一个 pdf
【发布时间】:2022-06-20 14:28:59
【问题描述】:

我的数据文件包含一长串案例,每个案例一行。我想生成一份长 PDF 报告,每个案例包含一页,每页包含相同的表格和图表,但针对不同的案例。

我知道我应该有一个“子”降价(一页),例如,childfile.Rmd

---
title: "case number `r params$case[1]`"
output: pdf_document
params:
    case: [0,0,0,0,0,0,0]
---

```{r part1, echo=FALSE}
params$case[2:4]
```


```{r part2, echo=FALSE}
params$case[5:7]
```

并使用“父级”降价中的循环来呈现它,例如,parentfile.Rmd

---
title: "all cases"
output: pdf_document
---

```{r parent, include=FALSE}

df = data.frame(number = c(1,2,3,4),
               var1   = c(1,2,3,4),
               var2   = c(1,2,3,4),
               var3   = c(1,2,3,4),
               var4   = c(1,2,3,4),
               var5   = c(1,2,3,4),
               var6   = c(1,2,3,4)               )

for ( i in 1:4 ){
  rmarkdown::render("childfile.Rmd", 
                    params = list(case = as.vector(df[i,])))
}
```

但是,这会导致父母的 pdf 为空白,孩子的第二个 pdf 仅包含最后一个案例。

如何将完整的子 PDF 集呈现为一个 PDF?

【问题讨论】:

    标签: r


    【解决方案1】:

    我认为这里有两个困难。首先是rmarkdown::render()会自己编译文档;要在父文档中编译子文档,knitr::knit_child() 可以解决问题。在下面的示例中,我使用this answer 中描述的技术将适当的情况提供给子项的每次迭代:使用变量而不是参数。

    第二个是,据我所知,LaTeX 文档只能有一个标题。所以我们不能给每个子文档自己的标题;但我们可以为每个标题指定一个标题(如果您愿意,可以轻松自定义其样式)。

    子文档

    请注意,子文档不是独立的降价文件;这对于我们要渲染的材料来说已经足够了。我们不是引用一个名为case 的参数,而是引用一个同名的变量。

    # case `r unname(unlist(case[1]))`
    
    ```{r}
    case[2:4]
    ```
    
    
    ```{r}
    case[5:7]
    ```
    
    \pagebreak
    

    父文档

    循环遍历df 的前四行。对于每一行,它设置变量case(子文档将需要它),然后使用knitr::knit_child() 来处理子文档。我们使用cat() 将编织输出发送回父文档;另请注意,此块至关重要地设置了 results='asis' 选项。

    ---
    title: "all cases"
    output: pdf_document
    ---
    
    ```{r setup, include=FALSE, echo=FALSE}
    df = data.frame(number = c(1,2,3,4),
                    var1   = c(1,2,3,4),
                    var2   = c(1,2,3,4),
                    var3   = c(1,2,3,4),
                    var4   = c(1,2,3,4),
                    var5   = c(1,2,3,4),
                    var6   = c(1,2,3,4))
    knitr::opts_chunk$set(echo=FALSE)
    ```
    
    ```{r parent, results='asis'}
    for(i in 1:4) {
      case = df[i,]
      cat(knitr::knit_child("childfile.Rmd", envir = environment(), quiet = T))
      cat("\n")
    }
    ```
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多