Knitr:for循环中每个.tabset一个绘图

AOG*_*STA 5 r knitr r-markdown

长话短说,我正在尝试使用knitr动态创建单独的tabsets并在每个tabset中渲染一个图.以下是我失败尝试的说明.我会很感激解决方案,但我怀疑我只是不理解knitr渲染输出的基本方式.因此,如果您可以向我指出资源或提供一些概念性指导,那么也将不胜感激.

动态创建标签集很容易.这是我的.R文件

#' ---
#' title: 
#' author: 
#' date: 
#' output:
#'    html_document
#' ---

#' # {.tabset}
#+ results='asis', echo=FALSE
for(i in 1:10){
  cat('##',i,' \n')
}
Run Code Online (Sandbox Code Playgroud)

当我在这个.R文件上调用rmarkdown :: render()时,我得到10个空的tabsets(见下文).我不确定猫做了什么或为什么\n是必要的(这是一些概念性的解释将被欣赏),但它的工作原理. 在此输入图像描述 现在我添加了对for循环的boxplot()调用,并期望在每个tabset上获得相同的boxplot.

#' ---
#' title: 
#' author: 
#' date: 
#' output:
#'    html_document
#' ---

#' # {.tabset}
#+ results='asis', echo=FALSE
for(i in 1:10){
  cat('##',i,' \n')
  boxplot(iris$Sepal.Length~iris$Species)
}
Run Code Online (Sandbox Code Playgroud)

但相反,第一个选项卡显示为空,第二个选项卡是输出的呕吐物. 在此输入图像描述

如果我添加另一个带有两个"\n"字符的cat(),则会显示所有选项卡,但只有第二个选项卡会填充图表.其他选项卡为空.

#' ---
#' title: 
#' author: 
#' date: 
#' output:
#'    html_document
#' ---

#' # {.tabset}
#+ results='asis', echo=FALSE
for(i in 1:10){
  cat('##',i,' \n')
  boxplot(iris$Sepal.Length~iris$Species)
  cat(' \n \n')
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

AOG*_*STA 5

所以我找到了一个解决方案,但仍然不知道它为什么会起作用.非常感谢任何反馈.在每个plot()之前添加plot.new().

#' ---
#' title:
#' author: 
#' date: 
#' output:
#'    html_document
#' ---

#' # {.tabset}
#+ results='asis', echo=FALSE
for(i in 1:10){
  cat('##',i,' \n')
  plot.new()
  boxplot(iris$Sepal.Length~iris$Species)
  cat(' \n \n')
}
Run Code Online (Sandbox Code Playgroud)