Knitr R:将多个绘图分组为HTML

时间:2015-11-27 17:53:12

标签: r knitr

我是Knitr的新手,我正在尝试在R markdown文件中执行以下操作。

我有一组名字,每个名字都有两个图。我需要为每个名称获取一个HTML文件,其中包含相应的图表。

{r, echo=FALSE} for name in setofNames{ barplot(xx) barplot(yy) }

我很失落如何做到这一点。有没有人有任何想法?

编辑: 我现在可以使用stitch()为每个名称生成不同的HTML文件。但是,我没有得到所有的图,我只保留了最后一次迭代的代码。我也探索了opts_chunk()功能,但是徒劳无功。它可能有一些东西可以清除缓存,但我不确定。

以下是一段代码:

for name in setofNames{
opts_chunk$set(echo=FALSE, fig.keep='all', fig.show='asis')
fname=paste(name,".html")
stitch_rhtml("../testSub.r",output=fname,envir=globalenv())
}

===testSub.r file===
barplot(xx)
barplot(yy)

会欣赏一些意见。

2 个答案:

答案 0 :(得分:1)

您可以使用par函数来获得所需内容。另外,我通常删除“echo = FALSE”因为它弄乱了我的针织html。

http://www.statmethods.net/advgraphs/layout.html

以下是为knitr输入的文本示例:

```{r}
df<- replicate(100, runif(n=20))
par(mfrow=c(2,3))
for (i in 2:7) hist(df[,i],main=colnames(df)[i])
```

如果您需要更具体的帮助,请告诉我,我会修改此帖子。

答案 1 :(得分:0)

一种解决方案是使用&#34;控制&#34;多次调用knitr的文件(每个名称一次)。每次knitr处理相同的Rmd - 模板但具有不同的数据。

在下面的代码中,我利用了knitr默认情况下使用调用环境中的对象这一事实(请参阅?knitenvir = parent.frame())。因此,可以修改&#34;控制&#34;中的对象。文件以及knitr的后续调用将在处理模板时使用该对象。

(当然,可以避免全局变量。然后,控制文件需要在特定环境中分配对象并将此环境传递给knitr。)

&#34;控制&#34;文件(control.R)可能如下所示:

library(knitr)

## Generate data
set.seed(1)
n <- 1000
dat <- data.frame(
  name = sample(x = LETTERS, size = n, replace = TRUE),
  value = rnorm(n))

## knit the template once per "name"

lapply(X = levels(dat$name), FUN = function(name) {
  currentSubset <- dat[dat$name == name, ]
  knit2html(input = "template.Rmd", output = sprintf("output_%s.html", name))
})

template.Rmd

```{r}
op <- par(mfrow = c(1, 2))

plot(currentSubset$value, col = "green", main = name)
plot(currentSubset$value, col = "red", main = name)

par(op)
```

这会为output_[Letter].html中的每个字母生成单独的HTML文件(levels(dat$name))。

请注意,每次调用knit2html都会覆盖figure目录中的图。但是,这并不重要,因为HTML文件不引用外部数字,但包含数据URI中的数字。这是由于markdown::markdownToHTML()调用的knitr::knit2html()

  

使用&lt; img&gt;链接的任何本地图片tag将被base64编码并包含在输出HTML中。

(资料来源:markdownToHTML