Knitr R:将多个地块分组到 HTML

Knitr R : Grouping multiple plots in to HTML

我是 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)

希望能提供一些意见。

您可以使用 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])
```

如果您需要更具体的帮助,请告诉我,我将对此进行编辑 post。

一种解决方案是使用 "control" 文件多次调用 knitr(每个名称一次)。每次 knitr 处理相同的 Rmd 模板但使用不同的数据。

在下面的代码中,我利用了 knitr 默认情况下使用调用环境中的对象这一事实(参见 ?knitenvir = parent.frame())。因此可以修改 "control" 文件中的对象,随后调用 knitr 将在处理模板时使用该对象。

(当然可以避免使用全局变量,那么控制文件就需要分配特定环境下的对象,并将这个环境传递给knitr。)

"control" 文件 (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)
```

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

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

Any local images linked using the <img> tag will be base64 encoded and included in the output HTML.

(来源:markdownToHTML