如何在 rmarkdown/knitr 中顺序输出部分(base r)图?
How to sequentially output partial (base r) plots in rmarkdown/knitr?
假设我有以下 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)
```
在每个 ## 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)))
```
输出的幻灯片如下所示:
但是如您所见,这很笨拙而且不是很笼统。解决方案的重要特征是绘图的代码行尽可能靠近,并且只写一次;理想情况下,我可以用一个块 option/hook.
最好的答案是保留回显添加到图表中的新代码行的能力(例如,## Next
标记之间的代码行),但会生成到该点为止的整个图。
实现此目标的最佳方法是什么?
编辑:此外,我希望能够将更改分组到一个绘图中,而不仅仅是将每个更改输出到一个新绘图中,所以 fig.keep
不会工作。
块选项 fig.keep
可以采用数字向量来索引地块,因此您可以通过 fig.keep = 2:4
选择最后三个地块(或通过 fig.keep = -1
删除第一个地块) .
要对不同幻灯片上的图表进行分组,您可以动态添加幻灯片标题。您可以将 cat('\n\n## Title\n\n')
与块选项 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)
```
请注意 knitr 的当前版本存在一个错误,即 I just fixed on Github。现在你需要使用 knitr 的 Github 版本:
if (packageVersion('knitr') <= '1.26')
remotes::install_github('yihui/knitr')
假设我有以下 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)
```
在每个 ## 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)))
```
输出的幻灯片如下所示:
但是如您所见,这很笨拙而且不是很笼统。解决方案的重要特征是绘图的代码行尽可能靠近,并且只写一次;理想情况下,我可以用一个块 option/hook.
最好的答案是保留回显添加到图表中的新代码行的能力(例如,## Next
标记之间的代码行),但会生成到该点为止的整个图。
实现此目标的最佳方法是什么?
编辑:此外,我希望能够将更改分组到一个绘图中,而不仅仅是将每个更改输出到一个新绘图中,所以 fig.keep
不会工作。
块选项 fig.keep
可以采用数字向量来索引地块,因此您可以通过 fig.keep = 2:4
选择最后三个地块(或通过 fig.keep = -1
删除第一个地块) .
要对不同幻灯片上的图表进行分组,您可以动态添加幻灯片标题。您可以将 cat('\n\n## Title\n\n')
与块选项 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)
```
请注意 knitr 的当前版本存在一个错误,即 I just fixed on Github。现在你需要使用 knitr 的 Github 版本:
if (packageVersion('knitr') <= '1.26')
remotes::install_github('yihui/knitr')