Вывод объектов ggplot2 и lm в цикле в RMarkdown - PullRequest
1 голос
/ 01 октября 2019

Это дополнительный вопрос к этому .

В вышеупомянутом вопросе я мог бы красиво реализовать создание заголовка и печать объекта ggplot2 в цикле.

Теперь у меня возникла новая проблема: мне нужно также напечатать сводку модели в цикле. Проблема в том, что он не работает, если у меня есть опция asis.

Есть идеи?

[Представлять:]

---
title: "Untitled"
output:
  html_document:
    theme: united
    highlight: tango
    toc: true
    toc_float:
      collapsed: false
      smooth_scroll: false
---

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

```{r}
library(dplyr)
library(ggplot2)

df <- datasets::iris %>% 
  dplyr::as_tibble()
```

```{r species_loop, results='asis'}
for(i in c("setosa", "versicolor", "virginica")) {

  cat(paste0("\n\n## ", i, "\n"))

  df_filtered <- df %>% 
    dplyr::filter(Species == i)

  p <-  df_filtered %>% 
    ggplot2::ggplot(ggplot2::aes(Sepal.Length, Petal.Length)) + 
    ggplot2::geom_point()
  print(p)

  my_model <- lm(Sepal.Length ~ Petal.Length, data = df_filtered)

  summary(my_model) %>% 
    print()
}
```

## I need the printing output of the model to look like this:

```{r}
df_filtered <- df %>% 
    dplyr::filter(Species == "setosa")

my_model <- lm(Sepal.Length ~ Petal.Length, data = df_filtered)

  summary(my_model) %>% 
    print()
```

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Похоже, что это случай для шаблона документа и knitr::knit_expand(). Канонический ответ: здесь . Работа со строками также отправила мне этот ответ , так как я не был полностью уверен, как нотация "{{" работает в этом подходе.

Этот подход включает создание шаблона R уценкидокумент в том же каталоге. В зависимости от того, хотите ли вы включить фрагменты кода или вам нужны имена фрагментов, это может выглядеть примерно так:

## {{species}}

```{r species_loop-{{species}}, echo = FALSE}
df_filtered <- df %>% 
     dplyr::filter(Species == "{{species}}")

df_filtered %>% 
     ggplot2::ggplot(ggplot2::aes(Sepal.Length, Petal.Length)) + 
     ggplot2::geom_point()

my_model <- lm(Sepal.Length ~ Petal.Length, data = df_filtered)
summary(my_model)
```

Тогда код вашего основного документа может выглядеть следующим образом:

```{r}
library(dplyr)
library(ggplot2)

df <- datasets::iris %>% 
  dplyr::as_tibble()
```

```{r, include = FALSE}
src <- lapply(c("setosa", "versicolor", "virginica"),
             function(species) {
                  knitr::knit_expand(file = "template.Rmd")
             }
)
```

`r knitr::knit(text = unlist(src))`
0 голосов
/ 01 октября 2019

Когда я заменяю строку summary () на тидимодель, вы можете передать в kable:

 print(broom::tidy(my_model) %>% knitr::kable())

Вам нужно будет настроить параметры вызова tidy (), чтобы включить больше выходов,но это работает для меня:

enter image description here

полный код:

for(i in c("setosa", "versicolor", "virginica")) {

  cat(paste0("\n\n## ", i, "\n"))

  df_filtered <- df %>% 
    dplyr::filter(Species == i)

  p <-  df_filtered %>% 
    ggplot2::ggplot(ggplot2::aes(Sepal.Length, Petal.Length)) + 
    ggplot2::geom_point()
  print(p)

  my_model <- lm(Sepal.Length ~ Petal.Length, data = df_filtered)

 print(broom::tidy(my_model) %>% knitr::kable())


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