У меня есть документ rmarkdown
, в котором я хочу использовать список data.table
с и включить их в документ 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."))
```
все хорошо, и таблица красиво отформатирована, как на скриншоте ниже.
![enter image description here](https://i.stack.imgur.com/DqSOB.jpg)
Однако, если я попытаюсь использовать от 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
и включить их в документ, я получаю довольно простой и грубый вывод, как на скриншоте ниже.
![enter image description here](https://i.stack.imgur.com/9Oj4L.jpg)
Далее, если я просто передам список data.table
с kable
, как это
```{r}
kable(list.of.dts)
```
Я получаю все таблицы с лучшим форматированием (хотя и не так, как в первом примере), но уложенными друг на друга, по центру страницы, и я не могу добавить подписи:
![enter image description here](https://i.stack.imgur.com/sAz6u.jpg)
Кто-нибудь знает, почему это происходит и как я могу преодолеть эту проблему?
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
```
Если я не сохраню вывод в новый объект, а затем верну его, я получу пустой документ. Выше работает (см. Скриншот ниже). Единственные проблемы состоят в том, что я вижу имена компонентов списка между таблицами и таблицами, а их заголовки выровнены по центру страницы:
![enter image description here](https://i.stack.imgur.com/FTnoI.jpg)
EDIT2:
Как заметил пользователь 20650 (спасибо), явный цикл будет работать лучше, потому что не будет отображаться ни одно из имен компонентов списка. Кроме того, нет необходимости присваивать результаты новому объекту, а затем возвращать его. Вот как это выглядит:
```{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.")))
}
```
![enter image description here](https://i.stack.imgur.com/nc0ob.jpg)
Единственная оставшаяся проблема - таблицы по-прежнему центрированы на странице.
EDIT3
Последней проблемой (см. Выше) было выравнивание таблиц и их заголовков по левому краю. 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
и исправляет поля.
Дело закрыто.