Заголовки Knitr / Kable для каждого элемента списка - PullRequest
0 голосов
/ 08 июля 2019

Мне нужно создать документ .pdf с R Markdown. Я использую пакет knitr, чтобы «преобразовать» мои фреймы данных в LaTeX. Обычно у меня нет проблем с этим, но на этот раз я совершенно не знаю, как решить мою проблему.

Мне нужно, чтобы заголовок каждого элемента (некоторые кадры данных) моего списка отображался как заголовок в файле .pdf.

Вот пример данных, которые у меня есть:

library(knitr)
library(kableExtra)

df1 <- data.frame(col1 = c(1,2,3), col2 = c("a", "b", "c"))
df2 <- data.frame(col1 = c(6,7,8), col2 = c("d", "e", "f"))
list <- list("df1" = df1, "df2" = df2)

print(list)

$`df1`
  col1 col2
1    1    a
2    2    b
3    3    c

$df2
  col1 col2
1    6    d
2    7    e
3    8    f

Мой knitr и kableExtra код:

my_function <- function(list){
    kable(list, "latex", longtable = T,
              caption = "df1 and df2 respectively") %>%
          kable_styling(font_size = 7,
                        latex_options = c("repeat_header"),
                        full_width = F)
}

print(lapply(list, my_function))

На данный момент заголовок для обеих таблиц в выходном документе будет df1 and df2 respectively, когда я хотел бы иметь df1 для первого и df2 для второго и так далее ...

Я не привык к list() внутри kable(), так как я в основном использую data.frame / data.table. Я попытался заменить caption аргументами, используя names(), cat(), ... и не получил желаемый результат. Я почти уверен, что в этом есть что-то простое.

Кто-нибудь может мне помочь? Спасибо.

1 Ответ

1 голос
/ 09 июля 2019

Вы можете печатать таблицы отдельно в цикле for, как также предлагается здесь: Неожиданное поведение kable при вызове из lapply или из функции с оператором print .

Rmarkdown

---
title: "List of tables"
output: 
  pdf_document
header-includes:
   - \usepackage{longtable}
---

```{r tables, results = "asis", echo = FALSE}
library(knitr)
library(kableExtra)

## data
df1 <- data.frame(col1 = c(1,2,3), col2 = c("a", "b", "c"))
df2 <- data.frame(col1 = c(6,7,8), col2 = c("d", "e", "f"))
ls <- list(df1 = df1, df2 = df2)

## tables
for(i in seq_along(ls)) {
  print(
      kable(ls[[i]], format = "latex", caption = names(ls)[i], longtable = TRUE) %>%
          kable_styling(font_size = 7, latex_options = "repeat_header", full_width = FALSE)
  )
}

```

PDF вывод

PDF_output

...