我想迭代我的R markdown文件中的结果集列表。当我生成输出时,我想要包含一些文本,例如带有结果集名称的标题。
我发现的一个hacky解决方案是直接在像
这样的文档中硬编码html输出## All results
```{r loopResults, echo=FALSE, results='asis'}
results = list(result1 = data.frame(x=rnorm(3), y=rnorm(3)), result2=data.frame(x=rnorm(3), y=rnorm(3)))
for(res in names(results)) {
cat(paste("<h3>Results for: ", res, "</h3>>"))
plot(results[[res]]$x, results[[res]]$y)
}
这似乎不是正确的做法,特别是因为我想在时间通过pandoc创建PDF文档,并且必须更改硬编码表达式。 (我目前有便利功能,如h3(文字,类型))。
有更好的方法吗?
答案 0 :(得分:7)
我会使用brew
和knitr
的组合来实现这一目标。我会创建一个名为doc.brew
的brew模板,看起来像这样
<% for (res in names(results)) { -%>
### Results for: <%= res %>
```{r}
plot(results[["<%= res %>"]]$x, results[["<%= res %>"]]$y)
```
<% } %>
您现在可以运行以下代码来获得所需的输出
results = list(
result1 = data.frame(x=rnorm(3), y=rnorm(3)),
result2=data.frame(x=rnorm(3), y=rnorm(3))
)
brew::brew('doc.brew', 'doc.Rmd')
knit2html('doc.Rmd')
答案 1 :(得分:4)
一种可能性是使您的降价文件生成降价而不是HTML。例如:
## All results
```{r loopResults, echo=FALSE, results='asis'}
results = list(result1 = data.frame(x=rnorm(3), y=rnorm(3)), result2=data.frame(x=rnorm(3), y=rnorm(3)))
for(res in names(results)) {
cat(paste("Results for: ", res,"\n"))
cat("=========================\n")
plot(results[[res]]$x, results[[res]]$y)
cat("\n")
}
```
如果您在R中应用knit()
功能,您将获得以下Markdown文件:
## All results
Results for: result1
=========================
![plot of chunk loopResults](figure/loopResults1.png)
Results for: result2
=========================
![plot of chunk loopResults](figure/loopResults2.png)
您应该能够使用pandoc
从此文件生成HTML或LaTeX吗?
答案 2 :(得分:4)
关注https://gist.github.com/yihui/3145751,您可以编写一个包含的子模板并将其循环显示。
foosub.Rmd
Results for `r res`
---------------------------
```{r}
plot(results[[res]]$x, results[[res]]$y)
```
foo.Rmd
```{r loopResults, include=FALSE}
results = list(result1 = data.frame(x=rnorm(3), y=rnorm(3)), result2=data.frame(x=rnorm(3), y=rnorm(3)))
out=NULL
for(i in 1:length(results)) {
res = names(results)[i]
out = c(out, knit_child('foosub.Rmd', sprintf('foosub-%d.txt', i)))
}
```
`r paste(out, collapse = '\n')`
主文件中的代码块本身不会产生任何输出,它只是呈现子文档,每个结果对应一个,并将它们全部存储在out
中(这就是为什么它有{ {1}})。所有格式化的输出都收集在include=FALSE
变量中,并由最后一行插入。
它有点尴尬,但它确实鼓励模块化,但它似乎并不像能够做到这么简单:
out
你不能。
答案 3 :(得分:0)
使用pander的替代解决方案:
<% for (res in names(results)) { %>
### Results for: <%= res %>
<%=
plot(results[[res]]$x, results[[res]]$y)
%>
<% } %>
只需Pandoc.brew
这一次就可以了解你的目标:
> Pandoc.brew('doc.brew')
### Results for: result1
![](/tmp/Rtmp4yQYfD/plots/568e18992923.png)
### Results for: result2
![](/tmp/Rtmp4yQYfD/plots/568e6008ed8f.png)
或生成HTML / docx / etc.在一次运行中:
> Pandoc.brew('doc.brew', output = tempfile(), convert = 'html')
> Pandoc.brew('doc.brew', output = tempfile(), convert = 'docx')