【问题标题】:Print ggplot2 and lm objects in a loop in RMarkdown在 RMarkdown 中循环打印 ggplot2 和 lm 对象
【发布时间】:2019-10-01 17:34:45
【问题描述】:

这是this one 的后续问题。

在上述问题中,我可以很好地实现标题创建和循环打印 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 部分”问题,但是当我用 broom::glance(my_model) 替换 print() 时,你可以创建一个整洁的结果表和管道它变成一个 kable()
  • 是的我知道,但在我的情况下我无法整理它..我需要使用对象的打印方法
  • this issue 中的讨论虽然相当陈旧,但似乎表明 asis 加逐字文本输出将会很困难。

标签: r r-markdown


【解决方案1】:

看起来这是一个模板文档和knitr::knit_expand() 的案例。一个规范的答案是here。使用字符串也将我发送到 this answer,因为我不完全确定 "{{" 表示法在这种方法中是如何工作的。

此方法涉及在同一目录中制作模板 R markdown 文档。根据您是要包含代码块还是需要块名称,这可能类似于:

## {{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))`

【讨论】:

    【解决方案2】:

    当我用 tidymodel 替换 summary() 行时,您可以通过管道输入 kable:

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

    您必须调整 tidy() 调用的设置以包含更多输出,但它对我有用:

    完整代码:

    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())
    
    
    }
    

    【讨论】:

    • 感谢您的回答,但在我的实际情况下,该模型不适用于 tidy()。我需要使用对象的打印方法。这就像在循环中有两个块:一个带有“asis”,一个没有它
    • 好的,很酷,不知道是不是别的原因。很遗憾,因为它似乎是包含格式化模型的最简单方法!祝你好运
    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多