创建参数化R标记文档?
我想在我的R标记文件中迭代结果集列表。当我生成输出时,我希望在结果集的名称中包含一些类似文本的标题 我发现的一个黑客解决方案是直接在文档中硬编码html输出,如下所示创建参数化R标记文档?,r,markdown,knitr,pandoc,R,Markdown,Knitr,Pandoc,我想在我的R标记文件中迭代结果集列表。当我生成输出时,我希望在结果集的名称中包含一些类似文本的标题 我发现的一个黑客解决方案是直接在文档中硬编码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))
## 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)
}
<% for (res in names(results)) { -%>
### Results for: <%= res %>
```{r}
plot(results[["<%= res %>"]]$x, results[["<%= res %>"]]$y)
```
<% } %>
##所有结果
```{r loopResults,echo=FALSE,results='asis'}
结果=列表(结果1=数据.frame(x=rnorm(3),y=rnorm(3)),结果2=数据.frame(x=rnorm(3),y=rnorm(3)))
用于(名称中的res(结果)){
类别(粘贴(“结果:”,res,“>”)
绘图(结果[[res]]$x,结果[[res]]$y)
}
这似乎不是正确的方法,尤其是因为我当时想通过pandoc创建PDF文档,并且必须更改硬编码的表达式。(我目前有h3(文本,类型)等方便功能)
有更好的方法吗?一种可能是让您的标记文件生成标记,而不是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()
函数,将得到以下标记文件:
## 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?接下来,您可以编写一个子模板以包含并循环该模板
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)
}
```
这是你做不到的。我将使用
brew
和knitr
的组合来实现这一点。我将创建一个名为doc.brew
的brew模板,如下所示
## 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)
}
<% for (res in names(results)) { -%>
### Results for: <%= res %>
```{r}
plot(results[["<%= res %>"]]$x, results[["<%= res %>"]]$y)
```
<% } %>
替代解决方案包括: 或在一次运行中生成HTML/docx/等:
> Pandoc.brew('doc.brew', output = tempfile(), convert = 'html')
> Pandoc.brew('doc.brew', output = tempfile(), convert = 'docx')
由于您使用的是
pandoc
,您可能会发现包pander
很有用。特别是函数?pander::pandoc.header
可能会引起兴趣。这是正确的方法。我认为,这里真正的问题是,你不应该使用
;对于h3,您应该使用降价语法####
:我相信最干净的解决方案将取决于循环中的内容。如果循环中有很多代码,那么在Rmd
中实现所有内容将是最干净的。如果循环中有很多标记,那么使用brew
模板作为中间模板将得到更干净的解决方案。这与我想要做的最为一致。虽然示例代码很短,但我正在研究的应用程序将更长。可惜模板太冗长,代码看起来很混乱。
> Pandoc.brew('doc.brew', output = tempfile(), convert = 'html')
> Pandoc.brew('doc.brew', output = tempfile(), convert = 'docx')