在R Markdown循环中使用flextable未能生成表格

15

我有很多表格要创建,并尝试在循环中创建它们。 我正在使用内部rstudio的rmarkdown和flextable。 在循环中使用print(theFlextable)命令会产生一系列文本,而不是表格。 这适用于docx和html输出类型。 如果我不使用循环,flextable将正确呈现。这是一个演示:

---
title: "Demo"
output: word_document
---

```{r setup, include=FALSE}
library(flextable)
```
## This Works
```{r iris, echo=F, message=F, error=F, results='asis'}
ft<-flextable(iris[1:10,])
ft
```
## This produces no output
```{r echo=F, message=F, error=F, results='asis'}
doThese<-c("setosa","virginica")
for (i in doThese){
  tbl<-subset(iris, Species==i)
  ft<-flextable(tbl[1:10,])
  ft
}
```
## This produces incorrect output
```{r echo=F, message=F, error=F, results='asis'}
doThese<-c("setosa","virginica")
for (i in doThese){
  tbl<-subset(iris, Species==i)
  ft<-flextable(tbl[1:10,])
  print(ft)
  cat("\n\n")
}
``` 

这是上面最后一个块的Word输出:

类型:flextable对象。列键:萼片长度、萼片宽度、花瓣长度、花瓣宽度、物种;标题有1行,正文有10行。原始数据集样本:萼片长度 萼片宽度 花瓣长度 花瓣宽度 物种 1 5.1 3.5 1.4 0.2 山鸢尾 2 4.9 3.0 1.4 0.2 山鸢尾 3 4.7 3.2 1.3 0.2 山鸢尾 4 4.6 3.1 1.5 0.2 山鸢尾 5 5.0 3.6 1.4 0.2 山鸢尾

类型:flextable对象。列键:萼片长度、萼片宽度、花瓣长度、花瓣宽度、物种;标题有1行,正文有10行。原始数据集样本:萼片长度 萼片宽度 花瓣长度 花瓣宽度 物种 101 6.3 3.3 6.0 2.5 维吉尼亚 102 5.8 2.7 5.1 1.9 维吉尼亚 103 7.1 3.0 5.9 2.1 维吉尼亚 104 6.3 2.9 5.6 1.8 维吉尼亚 105 6.5 3.0 5.8 2.2 维吉尼亚

3个回答

18
如果您有Pandoc版本> = 2(随RStudio 1.2捆绑),则可以使用 knit_print 。我发现
cat(knit_print(ft))

成功地在循环中打印了这些表。


1
这对我有用;虽然我无法将其导入到此命令中 - 但必须将表保存为“x”,然后使用cat(knit_print(x)) - Nova
3
请确保在代码块头选项中添加'results='asis'',以使此功能有效。 - Isaac Zhao
循环中的所有表格是否有修复程序,以便它们获得不同的数字? - BBB

4

我们经常需要循环遍历数据,在RMarkdown中创建子表。这里是一个针对flextable的简单解决方案:

```{r, report3, results='asis'}

doThese<-c("setosa","virginica")

for (i in doThese) {
  tbl<-subset(iris, Species==i)
  ft <- flextable(tbl[1:10,])
  flextable_to_rmd(ft)
}
 
```

重点提示:为代码块设置results="asis",并使用flextable_to_rmd函数代替print或cat。
请注意保留HTML标签。

看起来不错,但是当我尝试使用cat(knit_print())的替代方法时,它生成了相同数量的表格。例如,5个表格3.6。在这里,数字是递增的,但它们从1开始,并且不遵循文档的其余编号结构,其中我有一个"section#.table#"的结构,如3.6(第3节的第6个表格)。你有解决方案吗? - BBB
建议您将此作为单独的问题发布,并包括您使用的方法来分配整个文档中的表格编号的示例代码。此循环无法知道在它之前有多少个表格。一种方法是使用flextable_to_rmd()中的text_after参数粘贴内容以手动分配标签。 - GGAnderson

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接