【问题标题】:Knitr: one plot per .tabset in for-loopKnitr:for循环中每个.tabset一个图
【发布时间】:2016-04-06 17:27:01
【问题描述】:

长话短说,我正在尝试使用 knitr 来动态创建单独的选项卡集并在每个选项卡集中呈现一个情节。以下是我失败尝试的描述。我会很感激一个解决方案,但我怀疑我只是不理解 knitr 呈现输出的基本方式。因此,如果您能指出我的资源或提供一些概念性指导,我们将不胜感激。

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

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

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

当我在这个 .R 文件上调用 rmarkdown::render() 时,我得到 10 个空标签集(见下文)。我不确定 cat 做什么或为什么需要 \n (这是一些概念性解释值得赞赏的地方),但它确实有效。 现在我在 for 循环中添加 boxplot() 调用,并希望在每个选项卡集上获得相同的 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)
}

但是,第一个选项卡是空的,第二个选项卡是输出的呕吐物。

如果我添加另一个带有两个“\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')
}

【问题讨论】:

  • 我有一个 number_sections: yes 在 YAML 标头中使选项卡编号,有没有办法使它们不编号?

标签: r knitr r-markdown


【解决方案1】:

所以我找到了一个解决方案,但仍然不知道为什么它有效。任何反馈将不胜感激。在每个 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')
}

【讨论】:

    【解决方案2】:

    我不确定,但基于这些模式,我会说boxplot,就像大多数 R 的原生绘图函数一样,相互“重叠”。所以,rmarkdown::render 只看到生成了一个数字。通过调用plot.new,您是在告诉 R “完成”当前绘图,然后开始将绘图输出写入新绘图。这会产生十个不同的图。

    一个我觉得有用的技巧,你可能也会觉得有用:在调试/故障排除/弄清楚rmarkdown::render 和 R Markdown 的动态时,它还可以帮助检查“原始”Markdown 输出。您可以通过在 YAML 标头中包含 keep_md: TRUE 来告诉 rmarkdown::render 保留此文件(有关示例和更多信息,请参阅 **Advance http://rmarkdown.rstudio.com/html_document_format.html)。

    【讨论】:

    • 'overplot' 的想法是有道理的。我也不知道 keep_md 选项。我通常会编译,然后等待临时 md 文件出现在工作目录中,并在它消失之前打开。悲惨的人生!感谢您提供有用的反馈。
    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 2021-08-27
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多