我有一个rmarkdown
文档,我想在其中使用data.table
列表并将其包含在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."))
```
一切都很好,表格格式很好,如下面的截图所示。
但是,如果我尝试使用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
的列表传递给kable
,就像这样
```{r}
kable(list.of.dts)
```
我得到的所有表格都有更好的格式(虽然不像第一个例子中那样),但堆叠在彼此的顶部,居中在页面中间,我无法添加标题:
有谁知道为什么会发生这种情况,我该如何克服这个问题呢?
EDIT1:
我已将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
```
如果我不将输出保存到新对象然后返回它,那么我得到一个空白文档。以上工作(见下面的截图)。唯一的问题是我在表和表之间看到列表组件的名称,并且它们的标题在页面中间对齐:
EDIT2:
正如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.")))
}
```
唯一剩下的问题是表仍然在页面中居中。
EDIT3
最后一个问题(见上文)是将表格及其标题对齐到左侧。 user20650提出了一个适用于字幕的建议。在找到this email thread后,我修改了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
包并修复边距。
案件结案。