我是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)
会欣赏一些意见。
答案 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
默认情况下使用调用环境中的对象这一事实(请参阅?knit
:envir = 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)