在 r markdown 循环中使用 flextable 不生成表格

Posted

技术标签:

【中文标题】在 r markdown 循环中使用 flextable 不生成表格【英文标题】:Using flextable in r markdown loop not producing tables 【发布时间】:2019-03-11 06:26: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")

``` 

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

类型:弹性表对象。 col_keys: Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species header has 1 row(s) body has 10 row(s) original dataset sample: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa

类型:弹性表对象。 col_keys: Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species header has 1 row(s) body has 10 row(s) original dataset sample: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 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 弗吉尼亚州

【问题讨论】:

【参考方案1】:

如果您的 Pandoc 版本 >= 2(与 RStudio 1.2 捆绑),您可以使用 knit_print。我找到了

cat(knit_print(ft))

成功循环打印表格。

【讨论】:

这对我有用;虽然我无法输入此命令 - 必须将表另存为 x 然后 cat(knit_print(x)) 另外不要忘记在代码块头选项中设置 results='asis' 以使其正常工作 循环中的所有表是否都得到相同的数字?【参考方案2】:

我不确定这是否是正确的答案,但我用它来解决我的问题:

Looping through code in knitr and rmarkdown

【讨论】:

【参考方案3】:

我们经常需要遍历数据来在 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。

【讨论】:

以上是关于在 r markdown 循环中使用 flextable 不生成表格的主要内容,如果未能解决你的问题,请参考以下文章

可在 R markdown `asis` 块中反应,不显示循环

在 for 循环中生成 markdown 注释

R markdown:使用for循环生成文本并显示图形/表格

在 for 循环 r markdown 中包含两个变量之间的空格(pdf 输出)

在 R Markdown 文件中包含 HTML 文件?

markdown JS:在循环中使用闭包