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

ami*_*mit 13 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

CL.*_*CL. 15

这个问题类似于那个问题,虽然它是基于LateX/RNW的.此外,这个答案演示了如何动态生成一个rmarkdown文档.但是,这两个问题都不是这个问题的完全重复.

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

  • 找出每个部分所需的降价标记.这可能是一些事情

    ## This is section <section_name>
    Section data is `<section_data>`.
    Additional section text is: <section_text>.
    
    Run Code Online (Sandbox Code Playgroud)
  • 编写生成此标记的R代码,用适当的值替换占位符.

对于步骤2,使用sprintf是组合静态和动态文本的自然候选者.不要忘记使用块选项 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))
}
```
Run Code Online (Sandbox Code Playgroud)

输出:

这是A节

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

这是B节

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

这是C节

部分数据是0.58.附加部分文本是:FCJDDDMNLBUSJMCZVSBPYWCKSFJEARBXXFPAGBTKCWKHPEDGYWYTNGLVGQGJAFZRUMNSDCHKTTMGRFNSUZKFLOUGNWHUBNLVMGDB.

这是D节

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

  • @amit 好的,阅读您的解决方案。从技术上讲,它非常相似。在您的情况下,我的“模板”是一个子文档。我的 `sprintf` 是你的 `knit_child`。 (2认同)