11

我想遍历我的 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(文本,类型)这样的便利功能)。

有没有更好的方法来做到这一点?

4

4 回答 4

8

我会使用brew和的组合knitr来实现这一点。我会创建一个名为 brew 的模板doc.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')
于 2013-02-19T21:51:36.630 回答
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其中(这就是它具有的原因include=FALSE)。所有格式化的输出都收集在out变量中并由最后一行插入。

它有点尴尬,但它确实鼓励模块化,但它似乎并不像能够做到的那么简单:

```{r}
for(i in 1:10){
```

Plot `r i`
-----------

```{r}
plot(1:i)
}
```

你不能。

于 2013-02-19T14:21:55.783 回答
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")
}
```

如果你knit()在 R 中应用这个函数,你会得到下面的 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 吗?

于 2013-02-19T14:06:47.163 回答
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/等。在一次运行:

> Pandoc.brew('doc.brew', output = tempfile(), convert = 'html')
> Pandoc.brew('doc.brew', output = tempfile(), convert = 'docx')
于 2013-03-09T10:49:08.313 回答