循环遍历 Rmarkdown 中的分组 id 列并呈现 PDF

Posted

技术标签:

【中文标题】循环遍历 Rmarkdown 中的分组 id 列并呈现 PDF【英文标题】:Loop over grouped id column in Rmarkdown and render PDF 【发布时间】:2022-01-22 13:04:18 【问题描述】:

我在数据集中有 2 列:idtext

同一个 id 存在多个文本。我的目标是通过遍历 ID 号生成多个 PDF 文件(每个 ID 一个)。但是,我希望每个 pdf 都包含 ALL 该 ID 号的文本(使用 knitr::kable() 的表格格式)

这是我拥有的 .Rmd 文件的可重现示例:

---
title: "Loop over grouped IDs"
output:
  pdf_document:
    latex_engine: xelatex
params:
  id: i
---

```r setup, include=FALSE
knitr::opts_chunk$set(echo = TRUE, include= FALSE)

library(tidyverse)

df <- tibble(
  text = c(
    "text one for id#1",
    "text two for id#1",
    "text one for id#12",
    "text one for id#13",
    "text two for id#13",
    "text three for id#13",
    "text one for id#15",
    "text two for id#15"
  ),
  id = c(1, 1, 12, 13, 13, 13, 15, 15)
)

df_id_filtered <- df %>% filter(id == params$id)
```

## Hello ID\#`r df_id$id[i]`!

These are the collections of texts that belong to you

```r, echo=FALSE, results='asis'

texts <- df_id_filtered$text
table <- knitr::kable(texts, col.names = "text")
```

`r table`

我为循环代码创建了一个 .R 脚本,如下所示:

library(rmarkdown)
library(knitr)

# loop through the id rows in the filtered data frame and generate a pdf report for each ID with all the texts in the "text" column for that ID

for (i in seq_along(df_id_filtered)) 
    rmarkdown::render(input = "idText.Rmd",
                      params = list(id = i),
                      output_format = "pdf_document",
                      output_file = paste0("File", "_", "ID#", i, ".pdf"))

循环是如何准确链接到params: id 的? 如果我遍历整个 df 而不是 df_id_filtered,那么相同 ID 号的文本将位于单独的文件中。

seq_along() 是这里的正确选择吗? params = list() 应该是什么?

我的代码有效,但它不能针对整个唯一 ID 运行(仅针对其中 2 个)。

非常感谢任何帮助!谢谢!

【问题讨论】:

【参考方案1】:

如果您想遍历所有ID,我认为seq_along(df_id_filtered) 不是正确的选择。 df_id_filtered 是数据框,seq_along 将遍历列。由于您的数据中有 2 列,因此它仅针对 2 个 ID 运行。

你可以试试——

library(rmarkdown)
library(knitr)

for (i in unique(df$id)) 
  rmarkdown::render(input = "idText.Rmd",
                    params = list(id = i),
                    output_format = "pdf_document",
                    output_file = paste0("File", "_", "ID#", i, ".pdf"))

所以这里我们循环遍历数据中的每个uniqueid,并为它写一个pdf。

【讨论】:

谢谢!这有效!快速提问,在params = list() 中,我看到人们使用id = id 而不是id = i。有什么区别? 嗯,这些只是循环的变量,它可以是任何东西。如果您将for 循环更改为for(id in unique(df$id)) ...,您可以使用params = list(id = id)

以上是关于循环遍历 Rmarkdown 中的分组 id 列并呈现 PDF的主要内容,如果未能解决你的问题,请参考以下文章

PL/pgSQL 函数 - 遍历特定列并在循环中执行第二个查询

使用VBA循环遍历每一列并从大到小排序

循环遍历每个 HTML 表列并使用 jQuery 获取数据

PL/SQL:循环遍历 XML 列并从重复元素中提取值

如何快速将数据框中的时间列分组为间隔?

如何遍历列并检查该值是不是与下一个值匹配然后追加?