使用循环在rmarkdown中生成文本部分

时间:2016-04-17 09:29:28

标签: r knitr r-markdown

我需要生成一个由多个部分组成的报告,所有部分看起来都很相似,只有一些数据差异。部分的数量也取决于数据。我最终想拥有的是这样的:

```{r}
  section_names = c("A","B","C")
  section_data = c(13,14,16)
```

# some looping mechanism here with variable i

This is section `r section_names[i]`

This section's data is `r section_data[i]`

#more things go here for the section

#end of loop should go here

结果应该是一个单独的html /文档,所有部分都是一个接一个。

你能指点我用循环生成这样一个Rmd文件吗?

理想情况下,我希望看到像PHP这样的东西:

<$php for(i=0;i<10;i++) { ?>
   ## some html template + code chunks here
<$php } ?>

3 个答案:

答案 0 :(得分:12)

此问题类似于that one,尽管它基于LateX / RNW。此外,this answer演示了如何动态生成rmarkdown文档。但是,这两个问题都不是这个问题的完全重复。

基本上,有两个心理步骤:

  • 计算每个部分所需的降价标记。这可能是

    的内容
    ## This is section <section_name>
    Section data is `<section_data>`.
    Additional section text is: <section_text>.
    
  • 编写生成此标记的R代码,用适当的值替换占位符。

对于第2步,使用sprintf是结合静态和动态文本的自然候选者。不要忘记使用chunk options results = "asis"来阻止knitr在输出中添加格式,并使用cat(而不是print)来阻止R添加额外的东西,如报价和元素编号。

为了清晰起见,我稍微更改了输入数据结构(使用data.frame而不是独立的向量section_namessection_data)。

```{r echo = FALSE, results = "asis"}
input <- data.frame(
  name = LETTERS[1:4],
  data = runif(n = 4),
  text = replicate(4, paste(sample(x = LETTERS, size = 100, replace = TRUE), collapse = "")),
  stringsAsFactors = FALSE)

template <- "## This is section %s
Section data is `%0.2f`.
Additional section text is: %s.

" # dont't forget the newline

for (i in seq(nrow(input))) {
  current <- input[i, ]
  cat(sprintf(template, current$name, current$data, current$text))
}
```

输出:

  

这是A部分

     

部分数据为0.83。   附加部分文本是:PUFTZQFCYJFNENMAAUDPTWIKLBSVKWMJWODFHSPRJRROTVDGNEROBVQPLLMVNPOUUHGVGRPMKAOAOMVYXKMGMUHNYWZGPRAWPYLU。

     

这是B部分

     

部分数据为0.49。   附加部分文本是:PFTYCGFSGSMAYSSCZXWLNLDOQEBJYEVSJIYDJPEPSWQBNWJVRUKBTYIUSTOICFKJFEJCWCAYBCQSRTXUDEQLLXCZNPUKNLJIQJXE。

     

这是C部分

     

部分数据为0.58。   其他部分文字是:FCJDDDMNLBUSJMCZVSBPYWCKSFJEARBXXFPAGBTKCWKHPEDGYWYTNGLVGQGJAFZRUMNSDCHKTTMGRFNSUZKFLOUGNWHUBNLVMGDB。

     

这是D节

     

部分数据为0.52。   附加部分文本是:YQIXHABFVQUAAYZNWTZXJDISSLTZJJAZOLJMJSXEENFTUOFOTYKDNNUMFDXLJSWZEVDLCLSYCTSMEXFLBVQYRTBEVZLCTEBPUGTT。

答案 1 :(得分:3)

只是分享我最终使用的方法。

我为该部分写了一个降价文件。为主文档中的每个部分准备好数据,并循环遍历我需要的所有部分,每次使用部分Rmd调用knit_child()。

答案 2 :(得分:0)

我知道这很晚了,但是我在代码中使用了它来对编号的部分进行编号,并且可以使用。

for (k in 1:length(listcsv)){ #Begin Loop at pdf file one and continue until all have been completed
subsection <- paste("5", k, sep = ".")}

这使用循环号(k)创建子节号,然后将其粘贴到节号中。碰巧在第5节中,但是您可以使用相同的原理使各节和各小节无限制。