我需要生成一个由多个部分组成的报告,所有部分看起来都很相似,只有一些数据差异。部分的数量也取决于数据。我最终想拥有的是这样的:
```{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 } ?>
答案 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_names
和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))
}
```
这是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节中,但是您可以使用相同的原理使各节和各小节无限制。