Печать заголовков, графиков и таблиц в формате oop в rmarkdown - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь использовать ноутбуки RMarkdown / R для создания автоматического отчета на основе одного набора данных, разбитого по отделам. Интуитивно, я хочу использовать for l oop, который фильтрует набор данных по одному отделу, предоставляет заголовок, отображает несколько графиков и таблиц, указывающих c для этого отдела, а затем создает разрыв страницы и начинается с следующий отдел.

Вот пример того, что я имею до сих пор. Проблемы с полученным кодом:

  1. Повсюду есть пробелы, наверняка связанные с использованием dev.off() и plot.new(). Если я удаляю их, печатается только первый сюжет, а заголовки печатаются все вместе в начале. Если я включу вызовы dev.off и plot.new, я получу пустые графические заполнители.
  2. Повсюду есть элементы NA. Я не уверен почему. Они не появляются при запуске кода в RStudio, только в результирующем выводе.
  3. Я не могу заставить работать заголовки и вести себя как H1, H2 et c. заголовки. Они отображаются как вывод кода.

Я неправильно подхожу к этому? Разве я не должен использовать для l oop, а вместо этого делать что-то еще? Если я возьму все из l oop и сделаю это вручную, это прекрасно работает.

```
---
title: "Demo Notebook"
output:
  word_document: default
---

```{r echo=FALSE, message=FALSE, warning=FALSE, paged.print=TRUE, results= "asis"}
library(tidyverse)
library(knitr)

spp <- unique(iris$Species)

for (i in seq_along(spp)) {

  print(paste0("# Species: ", spp[i]))

  d <- iris %>%
    filter(Species == spp[i])

# one kind of plot
  p <- ggplot(d, aes(x = Sepal.Length, y = Sepal.Width)) +
    geom_smooth() +
    ggtitle(spp[i])

  print(p)
  dev.off()
  plot.new()

# another plot
  q <- plot(d$Sepal.Length)
  print(q)
  dev.off()

# a table
  print(kable(head(d)))

}

```

1 Ответ

1 голос
/ 13 февраля 2020

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

---
title: "Demo Notebook"
output:
  word_document: default
---
```{r setup, include=FALSE}
library(tidyverse)
library(flextable)
```


```{r, echo=FALSE, message=FALSE, warning=FALSE, results='asis', fig.height=3, out.width="50%"}
spp <- unique(iris$Species)

for (x in seq_along(spp)) {
  print(paste0("# Species: ", spp[x]))
  d <- iris %>% filter(Species == spp[x])
  cat("\n\n")
  # one kind of plot
  p1 <- ggplot(d, aes(x = Sepal.Length, y = Sepal.Width)) +
    geom_smooth() +
    ggtitle(spp[x])
  plot(p1)
  cat("\n\n")

  # another plot
  plot(d$Sepal.Length)
  cat("\n")

  # a table
  ft <- d[1:10, ] %>%
    flextable() %>%
    align(part = "all") %>% # left align
    set_caption(caption = "Table 1: Example") %>%
    font(fontname = "Calibri (Body)", part = "all") %>%
    fontsize(size = 10, part = "body") %>%
    theme_booktabs() %>% # default theme
    autofit()
  cat("\n")
  cat(paste("\n```{=openxml}",
    format(ft, type = "docx"),
    "```\n", sep = "\n"))

  cat("\n\n\\pagebreak\n")
  cat('<div style="page-break-before: always;" />')
}

```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...