16

我有一个rmarkdown文档,我想在其中使用data.tables 列表并将它们包含在 PDF/HTML/MS Word 文档中。列表的每个组件都包含一个data.table.

我想要实现的是使用kable在文档中添加带有标题的所有表格。

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

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

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

在此处输入图像描述

但是,如果我尝试像这样使用列表中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."))
})
```

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

在此处输入图像描述

此外,如果我只是通过data.tables 的列表来kable喜欢这个

```{r}
kable(list.of.dts)
```

我得到了格式更好的所有表格(尽管不像第一个示例那样),但彼此堆叠在一起,位于页面中间,我无法添加标题:

在此处输入图像描述

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

编辑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
```

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

在此处输入图像描述

编辑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.")))
}
```

在此处输入图像描述

唯一剩下的问题是表格仍然在页面中居中。

编辑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}
---

前两行header-includes:(加载caption包并定义阳离子的设置)将字幕的位置固定在左侧。最后一行加载floatrow包并修复边距。

结案。

4

0 回答 0