如何在 rmarkdown/knitr 中按顺序输出部分(基本 r)图?

ric*_*rey 7 r knitr r-markdown

假设我有以下 rmarkdown 代码:

---
title: "Untitled"
author: "Author"
date: "04/12/2019"
output: ioslides_presentation
---

## Slide title

```{r echo=FALSE}
plot(1:10, axes = FALSE, ty = "n")
axis(1)
## Next
axis(2)
## Next
points(1:10, 1:10)
```
Run Code Online (Sandbox Code Playgroud)

在每个## Next点,我想输出绘图的当前状态,以便我可以按顺序显示绘图的各个部分。我的最终目标是在ioslides演示文稿中创建后续幻灯片,其中包含顺序图,全部来自上面的代码(有一个警告,理想情况下,我不希望后面的代码行能够影响前面的代码行,就像上面可能发生的那样)。

我希望它与我目前解决它的方式具有相同的效果:

---
title: "Untitled"
author: "Author"
date: "04/12/2019"
output: ioslides_presentation
---

```{r setup, include=FALSE}

## Set up environment for running the code
env <- new.env()

## Source code to run, as a list of quotes

full_src <- list(
  quote({
    plot(1:10, axes = FALSE, ty = "n")
    axis(1)
    }),
  quote({
    axis(2)
    }),
  quote({
    points(1:10, 1:10)
    })
)

```

## Slide title

```{r echo=FALSE}
# Evaluate first set of lines
eval(full_src[[1]], envir = env)
# Reset environment so later code can't affect earlier code
rm(list = ls(envir = env), envir = env)
```

## Slide title

```{r echo=FALSE}
# Evaluate first and second set of lines
invisible(sapply(1:2, function(i) eval(full_src[[i]], envir = env)))
# Reset environment so later code can't affect earlier code
rm(list = ls(envir = env), envir = env)
```

## Slide title

```{r echo=FALSE}
# Evaluate all lines
invisible(sapply(1:3, function(i) eval(full_src[[i]], envir = env)))
```
Run Code Online (Sandbox Code Playgroud)

输出的幻灯片如下所示:

四张幻灯片

但正如你所看到的,这很笨重而且不是很普遍。解决方案的重要特征是情节的代码行尽可能靠近,并且只写一次;理想情况下,我可以使用块选项/钩子来做到这一点。

最好的答案是保留对添加到图形中的新代码行(例如,## Next标记之间的代码行)进行回显的能力,但会产生到该点的整个图。

实现这一目标的最佳方法是什么?

编辑:另外,我希望能够对绘图的更改进行分组,而不仅仅是将每个更改都输出到新绘图,因此fig.keep无法正常工作。

Yih*_*Xie 5

chunk 选项fig.keep可以使用数字向量来索引图,因此您可以通过fig.keep = 2:4(或通过删除第一个图fig.keep = -1)选择最后三个图。

要将不同幻灯片上的绘图分组,您可以动态添加幻灯片标题。您可以cat('\n\n## Title\n\n')与 chunk 选项results = 'asis'一起使用,也可以与knitr::asis_output().

下面是一个完整的例子:

---
title: "Untitled"
author: "Author"
date: "04/12/2019"
output: ioslides_presentation
---

```{r, include=FALSE}
new_slide = function(title = '\n\n## Next\n\n') {
  knitr::asis_output(title)
}
```

## Slide title

```{r echo=FALSE, fig.keep=2:4}
plot(1:10, axes = FALSE, ty = "n")
axis(1)

new_slide()
axis(2)

new_slide()
points(1:10, 1:10)
```
Run Code Online (Sandbox Code Playgroud)

请注意,当前版本的knitr中存在一个错误,我刚刚在 Github 上修复了该错误。现在你需要使用knitr的 Github 版本:

---
title: "Untitled"
author: "Author"
date: "04/12/2019"
output: ioslides_presentation
---

```{r, include=FALSE}
new_slide = function(title = '\n\n## Next\n\n') {
  knitr::asis_output(title)
}
```

## Slide title

```{r echo=FALSE, fig.keep=2:4}
plot(1:10, axes = FALSE, ty = "n")
axis(1)

new_slide()
axis(2)

new_slide()
points(1:10, 1:10)
```
Run Code Online (Sandbox Code Playgroud)