генерация таблицы в rmarkdown с использованием gtsummary и flextable - PullRequest
1 голос
/ 01 мая 2020

Большинство соавторов предпочитают таблицы в текстовом формате. С появлением rmarkdown, knitr, gtsummary и flextable это, наконец, достигло совершеннолетия, но я не могу обдумать, как создать итоговую таблицу ниже, не прибегая к ручной настройке отступа. Я думаю, что таблица I ниже оставляет слишком много воздуха между рядами, но я не могу понять, как программно установить интервал между строками (пробовал autofit, height, height_all, hrule без получения желаемого результата). Вместо этого я использовал компактный стиль в слове для генерации таблицы 2 ниже. Однако тогда я должен был бы вручную вставить отступ для категорий цилиндров. Кто-нибудь знает, как это можно сделать программно?


title: "testing T´s"
output:
  word_document:
    reference_docx: temp.docx
  html_document:
    df_print: paged
editor_options:
  chunk_output_type: inline
---

Plain 
====
```{r results='asis',echo=FALSE,message=FALSE}
library(gtsummary)
library(flextable)
set_gtsummary_theme(theme_gtsummary_jama())
a <- mtcars[1:20,c(1,2,9,4)] 
  b <- tbl_summary(a,
    missing="ifany",
    by=am,
    type=list(cyl~"categorical"))%>% 
      bold_labels() %>%
  add_p() %>% add_overall()
```


Flextable
====
```{r results='asis',echo=FALSE,message=FALSE}
fl <- gtsummary::as_flextable(b) %>%  font(fontname = "Bodoni 72",part = "all") %>% fontsize(size=8,part="all") %>%  autofit(add_h = -.5) 
fl
```

enter image description here

1 Ответ

2 голосов
/ 01 мая 2020

На данный момент нет простого способа сделать это. Но я включил пример кода, который, по моему мнению, решит вашу проблему.

С {flextable} важно порядок вызова функций. Запуск as_flextable() и добавление дополнительных вызовов, кажется, не дает вам того, что вы хотите.

Альтернатива - сохранить вызовы, при необходимости вставить новые вызовы гибких функций, а затем оценить вызовы. Это то, что делается в приведенном ниже примере.

---
title: "Untitled"
output: word_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, message = FALSE)
```


```{r}
library(tidyverse)
library(gtsummary)
library(flextable)

set_gtsummary_theme(theme_gtsummary_jama())

tbl <- 
  mtcars[1:20, c(1, 2, 9, 4)] %>%
  tbl_summary(
    missing = "ifany",
    by = am,
    type = list(cyl ~ "categorical")
  ) %>%
  bold_labels() %>%
  add_p() %>%
  add_overall()
```


### Default Flextable

```{r}
gtsummary::as_flextable(tbl)
```

### Compact Flextable

```{r}
# this function inserts additional flextable calls, then evaluates the calls
update_flextable_calls <- function(x, call_list, after) {
  # saving calls that create the flextable
  x_calls <- gtsummary::as_flextable(x, return_calls = TRUE)

  # adding new calls at `after=`
  after_n <- names(x_calls) %in% after %>% which()
  x_calls <- c(
    x_calls[1:after_n],
    call_list,
    x_calls[(after_n + 1):length(x_calls)]
  )

  # evaluating calls
  x_calls %>%
    unlist() %>%
    purrr::compact() %>%
    # concatenating expressions with %>% between each of them
    purrr::reduce(function(x, y) rlang::expr(!!x %>% !!y)) %>%
    # evaluating expressions
    eval()
}

# list of calls that make a table compact
compact_calls <- list(
  rlang::expr(font(fontname = "Bodoni 72", part = "all")),
  rlang::expr(fontsize(size = 8, part = "all")),
  rlang::expr(padding(padding.top = 0, part = "all")),
  rlang::expr(padding(padding.bottom = 0, part = "all"))
)

# adding the compact calls, and evaluating them
update_flextable_calls(
  x = tbl, # gtsummary table
  call_list = compact_calls, # calls that make flextable compact
  after = "footnote" # add calls after the "footnote" functions
) 
```

enter image description here

Это, очевидно, не является хорошим постоянным решением. У нас есть тема под названием theme_gtsummary_compact(), которая делает таблицы {gt} компактными с меньшим шрифтом и уменьшенным заполнением. Мы можем обновить тему, чтобы сделать flextables более компактными! Я был бы рад, если бы вы создали проблему на GitHub, чтобы обновить theme_gtsummary_compact() для гибких, и мы могли бы сотрудничать над решением, которое будет работать для вас. https://github.com/ddsjoberg/gtsummary/issues/new/choose

...