rmarkdown, использующий kable со списком data.tables, теряет форматирование таблицы - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть документ 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

Однако, если я попытаюсь использовать от 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

Далее, если я просто передам список data.table с kable, как это

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

Я получаю все таблицы с лучшим форматированием (хотя и не так, как в первом примере), но уложенными друг на друга, по центру страницы, и я не могу добавить подписи:

enter image description here

Кто-нибудь знает, почему это происходит и как я могу преодолеть эту проблему?

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

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

Единственная оставшаяся проблема - таблицы по-прежнему центрированы на странице.

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 и исправляет поля.

Дело закрыто.

...