我有一个rmarkdown
文档,我想在其中使用data.table
s 列表并将它们包含在 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."))
```
一切都很好,表格的格式很好,如下面的屏幕截图所示。
但是,如果我尝试像这样使用列表中lapply
的kable
所有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.table
s 的列表来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
包并修复边距。
结案。