使用循环在rmarkdown中生成一段文本

2024-03-19

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

```{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 } ?>

这个问题类似于that one https://stackoverflow.com/questions/31817908/create-pdf-using-rhtml-and-iterate-over-data-frame,尽管它是基于 LateX/RNW 的。除了,这个答案 https://stackoverflow.com/a/35092679/2706569演示如何动态生成 rmarkdown 文档。然而,这两个问题都不是与这个问题完全相同的。

基本上,需要采取两个心理步骤:

  • 找出每个部分所需的降价标记。这可能类似于

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

对于步骤 2,使用sprintf https://stat.ethz.ch/R-manual/R-devel/library/base/html/sprintf.html是结合静态和动态文本的自然候选者。不要忘记使用块选项 http://yihui.name/knitr/options/ results = "asis"阻止knitr从添加格式到您的输出并使用cat(代替print)以防止 R 添加额外的内容,例如引号和元素编号。

为了清楚起见,我稍微改变了输入数据结构(使用data.frame而不是独立向量section_names and section_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))
}
```

Output:

这是A部分

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

这是B部分

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

这是C部分

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

这是D部分

部分数据是0.52。 其他部分文本为:YQIXHABFVQUAAYZNWTZXJDISSLTZJJAZOLJMJSXEENFTUOFOTYKDNNUMFDXLJSWZEVDLCLSYCTSMEXFLBVQYRTBEVZLCTEBPUGTT。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用循环在rmarkdown中生成一段文本 的相关文章

随机推荐