rmarkdown将kable与data.tables列表一起使用会丢失表格式

pan*_*man 5 r tabular r-markdown kable

我有一个rmarkdown要使用data.tables 列表并将其包含在PDF / HTML / MS Word文档中的文档。列表的每个组成部分都包含一个data.table

我想要达到的目的是使用kable带有标题的文档添加所有表。

当我data.table像这样一一索引

```{r}
 kable(list.of.dts[[1]], caption = paste0("Frequency table for the '", colnames(list.of.dts[[1]])[2], "' variable."))
```
Run Code Online (Sandbox Code Playgroud)

一切都很好,并且表格的格式正确,如下面的屏幕截图所示。

在此处输入图片说明

但是,如果我尝试使用lapplykable所有data.tables在列表中这样

```{r}
lapply(X = list.of.dts, FUN = function(i) {
  kable(x = i, caption = paste0("Frequency table for the '", colnames(i)[2], "' variable."))
})
```
Run Code Online (Sandbox Code Playgroud)

处理所有内容data.tables并将它们包含在文档中,我得到了相当基本的粗略输出,如下面的屏幕截图所示。

在此处输入图片说明

此外,如果我只是将data.tables 的列表传递给kable这样

```{r}
kable(list.of.dts)
```
Run Code Online (Sandbox Code Playgroud)

我得到了所有具有更好格式的表(尽管不是第一个示例中的表),但是彼此堆叠,位于页面中间,并且不能添加标题:

在此处输入图片说明

有谁知道为什么会这样,我该如何克服这个问题?

编辑1:

我已经放入result="asis"了第一个示例的大块并将输出保存到一个对象,然后返回该对象,它就成功了:

```{r, echo = FALSE, results='asis'}
my.list2 <- lapply(X = list.of.dts, FUN = function(i) {
  kable(x = i, caption = paste0("Frequency table for the '", colnames(i)[2], "' variable."))
})
my.list2
```
Run Code Online (Sandbox Code Playgroud)

如果我不将输出保存到新对象然后返回它,那么我将得到一个空白文档。上面的作品(请参见下面的截图)。唯一的问题是,我看到表之间的列表组件的名称以及这些表的标题在页面中间对齐:

在此处输入图片说明

编辑2:

正如user20650(谢谢您)所指出的,显式循环会更好,因为不会显示任何列表组件的名称。除此之外,无需将结果分配给新对象然后返回它。外观如下:

```{r, echo = FALSE, results='asis'}
for(i in list.of.dts) {
  print(kable(x = i, caption = paste0("Frequency table for the '", colnames(i)[2], "' variable.")))
}
```
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

唯一剩下的问题是表格仍位于页面中心。

编辑3

最后一个问题(见上文)是将表格及其标题向左对齐。user20650提出了适用于字幕的建议。找到此电子邮件线程之后,我yaml按如下所示修改了标题,并将这些LaTeX选项添加到该header-includes:部分:

---
title: "My report"
author: "John Doe"
output: pdf_document
toc: true
header-includes:
  - \usepackage{caption}
  - \captionsetup{justification=raggedright,singlelinecheck=false}
  - \usepackage[margins=raggedright]{floatrow}
---
Run Code Online (Sandbox Code Playgroud)

header-includes:(加载caption程序包并定义阳离子的设置)的前两行将标题的位置固定在左侧。最后一行加载floatrow包装并固定边距。

案件结案。