Как управлять размером гибких объектов с большими фрагментами текста в rmarkdown

#r-markdown #flextable

#r-markdown #гибкий

Вопрос:

Я испытывал трудности при создании таблицы с использованием flextable в RMarkdown, где для большой строки текста в таблице выходные данные PDF (и HTML) продолжали печатать очень маленькую таблицу. Изменение настроек в заголовке фрагмента (например, высота рисунка) или использование flextable::autofit() или flextable::width() не сработало. Пример:

 library(tidyverse) # for %>%
library(flextable)
  
 text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Ornare massa eget egestas purus viverra accumsan in nisl. Sociis natoque penatibus et magnis dis. Odio euismod lacinia at quis. Pellentesque elit ullamcorper dignissim cras tincidunt. In egestas erat imperdiet sed euismod nisi porta lorem mollis. Convallis posuere morbi leo urna. Sit amet consectetur adipiscing elit duis tristique sollicitudin. Ac odio tempor orci dapibus ultrices in iaculis nunc. Egestas tellus rutrum tellus pellentesque eu tincidunt tortor."
df = as.data.frame(text)

text_in_box = flextable(df) %>%
  theme_box() %>%
  delete_part(part = "header") %>%
  align(align = "left", part = "all") %>%
  set_caption("Interesting text") %>% 
  autofit()
  
knitr::knit_print(text_in_box)

  

вывод для примера выше

Ответ №1:

Ответ, который я нашел, — это функция flextable::height(). Это управляет высотой для строки, а не для строки, как я ошибочно предположил. Поскольку весь текст помещается в одну строку, он уменьшает текст до очень маленького размера, если по умолчанию установлена функция height(). Итак, вам нужно немного поработать с точной высотой, которая соответствует количеству имеющихся у вас строк, в данном случае это была height = .6. Я могу представить, что добавление нескольких новых строк (с использованием » n») к текстовому тексту также может быть полезно, если вы хотите управлять объемом текста в одной строке, что, в свою очередь, повлияет на высоту, которую вы, возможно, захотите установить в height ().

 text_in_box = flextable(df) %>%
  theme_box() %>%
  delete_part(part = "header") %>%
  align(align = "left", part = "all") %>%
  set_caption("Interesting text") %>% 
  autofit() %>%
  height(height = .6)
  
knitr::knit_print(text_in_box)

  

введите описание изображения здесь

Надеюсь, этот ответ сэкономит кому-то время, которое потребовалось мне, чтобы разобраться в этом!

Ответ №2:

Возможно, вы используете старую версию flextable. Вы использовали 3-й вариант, я думаю, вас заинтересуют 1-й и 2-й варианты:

 ---
output: word_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(tidyverse) # for %>%
library(flextable)
text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Ornare massa eget egestas purus viverra accumsan in nisl. Sociis natoque penatibus et magnis dis. Odio euismod lacinia at quis. Pellentesque elit ullamcorper dignissim cras tincidunt. In egestas erat imperdiet sed euismod nisi porta lorem mollis. Convallis posuere morbi leo urna. Sit amet consectetur adipiscing elit duis tristique sollicitudin. Ac odio tempor orci dapibus ultrices in iaculis nunc. Egestas tellus rutrum tellus pellentesque eu tincidunt tortor."
df = as.data.frame(text)
```

## With `set_table_properties(layout = "autofit")`

```{r}
flextable(df) %>%
  theme_box() %>%
  delete_part(part = "header") %>%
  align(align = "left", part = "all") %>%
  set_caption("Interesting text") %>% 
  set_table_properties(layout = "autofit")
```

## With a fixed width

```{r}
flextable(df) %>%
  theme_box() %>%
  delete_part(part = "header") %>%
  align(align = "left", part = "all") %>%
  set_caption("Interesting text") %>% 
  width(width = 4) 
```

## With a fixed width and a fixed height

```{r}
flextable(df) %>%
  theme_box() %>%
  delete_part(part = "header") %>%
  align(align = "left", part = "all") %>%
  set_caption("Interesting text") %>% 
  width(width = 4) %>% 
  height(height = .6) %>% 
  hrule(rule = "exact", part = "all")
```
  

введите описание изображения здесь

Комментарии:

1. эй, Дэвид, я должен был упомянуть, что я вяжу PDF (bookdown::pdf_document2), и ни один из этих методов, похоже, не работает в этом случае .. Смотрите мой вывод здесь