简单的手动RMarkdown表格,可以在HTML、PDF和DOCX中呈现出良好的效果

69
我该如何手动简单地在RMarkdown中格式化表格,以便在转换为HTML(使用knitr和markdown包)、PDF(使用pandoc和miktex)和docx(使用pandoc)时看起来良好?
我希望能够在RMarkdown中编写小型表格,这些表格不是由R函数生成的,并且在我经常使用的三种格式中都能呈现出良好的效果。到目前为止,我已经找到了一种在2个格式中看起来很好的格式,但3/3是否可能?
第一种格式在Knit HTML后看起来不错,但在PDF或docx中不好看。
<table>
<tr>
<td>Eggs</td>
<td>Ham</td>
</tr>
<tr>
<td>Basil</td>
<td>Tomato</td>
</tr>
</table>

第二个问题,这个在Knit HTML之后看起来很好,但在PDF或docx中不好。

| Tables        | Are           | Cool  |
| ------------- |:-------------:| -----:|
| col 3 is      | right-aligned | $1600 |
| col 2 is      | centered      |   $12 |
| zebra stripes | are neat      |    $1 |

三. 这个在 Knit HTML 后看起来不太好,但在 PDF 和 docx 中效果很好(目前最佳选项)。

V1         Tweedledee       Tweedledum
--------   --------------   ----------------
Age        14               14
Height     3'2"             3'2"
Politics   Conservative     Conservative
Religion   "New Age"        Syrian Orthodox
---------  --------------   ----------------

四. 这在使用Knit HTML并生成PDF和docx文档后看起来很不错(赢家!),但这不是我想要的手动格式。
```{r table1, echo=FALSE, message=FALSE, warnings=FALSE, results='asis'}
require(pander)
panderOptions('table.split.table', Inf)
set.caption("Data on cars")
pander(mtcars, style = 'rmarkdown')
```

这是我制作PDF和docx文件的方法:
filen <- "table" # name of my RMarkdown file without suffix
knit(paste0(filen,".Rmd"))

# make PDF
system(paste0("pandoc -s ", paste0(filen,".md"), " -t latex -o ", paste0(filen,".pdf"), " --highlight-style=tango  -S"))

# make docx
system(paste0("pandoc -s ", paste0(filen,".md"), " -o ", paste0(filen,".docx"), " --highlight-style=tango  -S"))

2
“pander” 解决方案有什么问题吗?我的意思是,您也可以重现相同的表格语法,这只是一个将 R 对象转换为 Pandoc 管道语法的函数。 - daroczig
2
@daroczig pander 可以从 R 对象生成出色的表格,但我想看看是否可以获得一个没有 R 对象的出色表格。例如,非常简单的文本表格。我找不到方法,所以也许制作一个我的简单表格的数据框,然后使用 pander 是最好的选择。 - Ben
1
我明白了,谢谢@Ben的评论。当然,你可以手动创建这样的表格(不使用pander),只需阅读我在上面链接的URL中关于语法的手册。或者只需运行pander(mtcars, style = 'rmarkdown')并将其与你的解决方案进行比较,看看有什么区别。 - daroczig
2个回答

59

受daroczig的评论启发,特别是提示 pander 可以转换为 pandoc 的管道语法,我仔细研究了 pander 文档并发现了 cat 的参考。经过一些尝试,我找到了胜者:

```{r table2, echo=FALSE, message=FALSE, warnings=FALSE, results='asis'}
tabl <- "
| Tables        | Are           | Cool  |
|---------------|:-------------:|------:|
| col 3 is      | right-aligned | $1600 |
| col 2 is      | centered      |   $12 |
| zebra stripes | are neat      |    $1 |
"
cat(tabl) # output the table in a format good for HTML/PDF/docx conversion
```

在我的测试中,这种方法可以在HTML、PDF和docx中生成外观统一的漂亮表格。现在我要去给daroczig投票支持他解决我的问题。

如果你需要为你的表格添加标题...那么你需要稍微改变一下做法。请注意,标题只会在PDF中可见,而不会在HTML中显示:

```{r table-simple, echo=FALSE, message=FALSE, warnings=FALSE, results='asis'}
require(pander)
panderOptions('table.split.table', Inf)
set.caption("My great data")
my.data <- " # replace the text below with your table data
  Tables        | Are           | Cool
  col 3 is      | right-aligned | $1600 
  col 2 is      | centered      |   $12 
  zebra stripes | are neat      |    $1"
df <- read.delim(textConnection(my.data),header=FALSE,sep="|",strip.white=TRUE,stringsAsFactors=FALSE)
names(df) <- unname(as.list(df[1,])) # put headers on
df <- df[-1,] # remove first row
row.names(df)<-NULL
pander(df, style = 'rmarkdown')
```

17
我发现你的评论(#在此处创建简单表格)会干扰pandoc。为了让表格在我的电脑上正常显示,表格前面必须有一个空行。请注意,这里不需要解释或提供额外信息,只需翻译原文即可。 - Wesley
2
knitrbookdown 包的作者建议使用 knitr::kable 作为 R Markdown 的多格式输出的最佳解决方案,特别是如果您想要带有标题和内部引用+链接的表格。请参见此处 - FairMiles
1
@FairMiles,kable的问题在于很难在一列中有多种类型的数据或格式。它适用于可以放置在数据框中的内容,但也仅限于可以放置在数据框中的内容。所以在这种情况下,恐怕没有其他选择,除非您在触及kable之前手动格式化并转换为字符。 - Joris Meys
我正在使用深色主题。有没有办法让这个表格的背景变浅(改变颜色或背景)? - Nova
如何将此表格放置在文档的左侧。它总是被放置在文档的中心。 - SID

3

随着R Markdown表格库的不断发展,现在有许多更好的答案来回答这个问题。仅几个月前进行的比较通常是没有帮助或误导性的。因此,我经常需要快速原型设计几个选项,以对各种复杂度的表格报告布局进行比较。

以下是一种简单的方法和工具集,可用于评估使用自己的数据的替代表格库和输出格式:

  1. 使用以下代码创建TableTester.Rmd文件。 (注意:您可以使用自己的df来尝试特定于包的格式)
  2. 使用TestRunner.R脚本(下面的代码)生成html、pdf和docx输出。

R Markdown 代码 - TableTester.Rmd

---
title: "Table-Evaluation"
output: 
  pdf_document: 
    latex_engine: xelatex
  html_document:
    theme: cosmo
  word_document: default
---

```{r setup-data-test, include=FALSE}

library(reactable)
library(kableExtra)
library(flextable)

df <- tibble(
  food = c("eggs", "ham", "squash", "rhubarb"),
  color = c("green", "green", "yellow", "purple"),
  class = c("imaginary", "imaginary", "real", "real")
)

```
```{r, test}
reactable(df)

kbl(df)

flextable(df)

```

R脚本 - TestRunner.R

for (i in c("html_document", "pdf_document", "word_document")) {
  rmarkdown::render(
    input = "TableTester.Rmd",
    output_format = i)
}

嗨,这对我有用。我如何在表格内包含引用?另外,我如何在标题中包含空格?(例如,食物消耗= c(“@Author2020”,“火腿”,“南瓜”,“大黄”),谢谢!) - vagvaf
1
阅读tibble的文档后,我发现你可以这样做第二个问题的第二部分: tibble( `crazy name` = 1)) https://tibble.tidyverse.org/articles/tibble.html - vagvaf

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