58

如何手动简单地格式化 RMarkdown 中的表格,将其转换为 HTML(使用 knitr 和 markdown 包)、PDF(使用 pandoc 和 miktex)和 docx(使用 pandoc)时看起来不错?

我希望能够在 RMarkdown 中编写小表,这不是 R 函数在我最常用的三种格式中看起来不错的结果。到目前为止,我找到了一种在 3 种格式中的 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"))
4

2 回答 2

48

受到 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')
```
于 2013-11-15T18:24:04.420 回答
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)
}
于 2022-01-03T21:27:56.937 回答