在循环中创建RMarkdown代码块

8

我希望能够通过循环创建RMarkdown代码块。我尝试使用for循环来实现,但是没有取得太多成功。我认为这可能可以通过lapply来实现,就像在Shiny应用程序中创建UIs一样。然而,到目前为止,我还没有取得任何成功。

Reprex:

---
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、versicolor和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()
}

有什么想法可以实现这个吗?

你需要重复的代码显示在输出中吗?还是只需要每个组的标题,然后在其下方显示结果图? - Marius
标题:使用Python绘制简单的折线图结果图表:(请参考附件) - FMM
1
也许这正是你所需要的内容:点击这里 - Stéphane Laurent
2个回答

9
如果您想在循环内创建标题和输出,可以这样做:
```{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()图。

2
一个基于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`

你会在你的工作目录(getwd())中找到你的.Rmd文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接