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
默认情况下使用调用环境中的对象这一事实(参见 ?knit
:envir = 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)
我是 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
默认情况下使用调用环境中的对象这一事实(参见 ?knit
:envir = 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)