循环创建RMarkdown块

时间:2019-07-15 06:50:56

标签: r r-markdown

我希望能够在循环中创建RMarkdown块。我尝试通过for循环执行此操作,但没有成功。我想这可以通过lapply来实现,就像在闪亮的应用程序中创建UIs一样。但是,到目前为止,我还没有任何成功。

代表:

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

## setosa

```{r}
df %>% 
  dplyr::filter(Species == "setosa") %>% 
  ggplot2::ggplot(ggplot2::aes(Sepal.Length, Petal.Length)) + 
  ggplot2::geom_point()
```

## versicolor

```{r}
df %>% 
  dplyr::filter(Species == "versicolor") %>% 
  ggplot2::ggplot(ggplot2::aes(Sepal.Length, Petal.Length)) + 
  ggplot2::geom_point()
```

## virginica

```{r}
df %>% 
  dplyr::filter(Species == "virginica") %>% 
  ggplot2::ggplot(ggplot2::aes(Sepal.Length, Petal.Length)) + 
  ggplot2::geom_point()
```

我的目标是创建带有循环的标题(setosa,杂色和virginica)和块。

例如:

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

  ## i

  df %>% 
    dplyr::filter(Species == i) %>% 
    ggplot2::ggplot(ggplot2::aes(Sepal.Length, Petal.Length)) + 
    ggplot2::geom_point()
}

关于如何实现此目标的任何想法?

2 个答案:

答案 0 :(得分:2)

如果要在循环中创建标题和输出,可以执行以下操作:

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

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

  p <- df %>% 
    dplyr::filter(Species == i) %>% 
    ggplot2::ggplot(ggplot2::aes(Sepal.Length, Petal.Length)) + 
    ggplot2::geom_point()
  print(p)
}
```

所以:

  • 使用results='asis'允许将您的cat()输出解释为Markdown语法
  • cat()设置了必需的markdown语法以生成标头(用一些换行符包围以确保其正确解释)
  • 明确print()在循环中绘制图。

答案 1 :(得分:1)

基于cat的函数将为每种虹膜种类复制您的块。对于一次性块,请使用单个cat

FUN <- function(x) cat("\n##", x, "
```{r}
df %>%
  dplyr::filter(Species == ",x, ") %>%
  ggplot2::ggplot(ggplot2::aes(Sepal.Length, Petal.Length)) +
  ggplot2::geom_point()
```\n")

要生成显示的.Rmd文件,可以使用sink。 (为简洁起见,我将在此处省略标题。)

sink(file="iris.Rmd")  ## start `sink`

cat("```{r}
library(dplyr)
library(ggplot2)
df <- datasets::iris %>% 
  dplyr::as_tibble()
```")

invisible(sapply(c("'setosa'", "'versicolor'", "'virginica'"), FUN))

sink()  ## end `sink`

您将在工作目录(.Rmd)中找到getwd()文件。