使用 tab.id 和 officedown R 包在循环中生成表

Generate tables in a loop with tab.id with officedown R package

有没有办法在循环中生成表格并设置tab.id可以稍后cross-referenced?在循环中生成表很简单,但我不知道之后如何设置 ID 和标题。请看下面的代码。在这里,我正在迭代 R data.frames 的列表。在最后一个块中,我将 id 向量(其长度为 2)放入块选项 - tab.id 和 tab.cap。这导致生成了两个表(很好),但是如何获取块中当前处理的 data.frame 的 id?

---
output: officedown::rdocx_document  
---

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

```{r}
library(flextable)

dfs <- list(
  df1 = head(iris),
  df2 = head(mtcars)
)

df_ids <- names(dfs)
```

```{r results='asis', tab.cap=paste("Result for item", df_ids), tab.id=paste0("tab_", df_ids), 
tab.cap.style = "Table Caption"}

flextable(dfs[[???]]) # can current id be accessed somehow?
```

另一种选择是使用for 循环生成表格。但是之后如何设置tab.id和tab.cap呢?即使是变通解决方案也适合我。

您可以使用 knitr::opts_chunk$set() 在循环中设置这些值。在你的情况下,我可能更喜欢 set_caption

要在 R Markdown 文档中循环打印 flextables,请使用 flextable_to_rmd()。参见 Looping in R Mardown documents

---
output: officedown::rdocx_document
---

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

```{r}
library(flextable)
library(officer)
library(officedown)
library(magrittr)

dfs <- list(
  df1 = head(iris),
  df2 = head(mtcars)
)

df_ids <- names(dfs)
```

```{r results='asis'}
for(i in df_ids){
  z <- flextable(dfs[[i]]) %>% 
    set_caption(caption = paste("Result for item", i),
                style = "Table Caption",
                autonum = run_autonum(seq_id = "tab", bkm = i))
  flextable_to_rmd(z)
  crossref_id <- sprintf("\@ref(tab:%s)", i)
  cat("\n\n\nA ref to table ", crossref_id, "\n\n\n\n")
}
```