Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建参数化R标记文档?_R_Markdown_Knitr_Pandoc - Fatal编程技术网

创建参数化R标记文档?

创建参数化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))

我想在我的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)))

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')