我需要生成一个由几个部分组成的报表,所有部分看起来都很相似,只是数据有一些不同。部分的数量也取决于数据。我最终想要的是这样的:
```{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 } ?>
4条答案
按热度按时间xqnpmsa81#
这个问题类似于that one,虽然它是基于LateX/RNW的。此外,this answer演示了如何动态生成一个rmarkdown文档。但是,这两个问题都不是这个问题的完全重复。
基本上,有两个心理步骤要采取:
对于第2步,使用
sprintf
是合并静态和动态文本的自然选择。不要忘记使用chunk optionsresults = "asis"
来防止knitr
向输出添加格式,使用cat
(而不是print
)来防止R添加额外的东西,如引号和元素编号。为了清晰起见,我稍微更改了输入数据结构(使用
data.frame
代替独立向量section_names
和section_data
)。cl25kdpy2#
只是分享一下我最终使用的方法。
我为该节编写了一个markdown文件,为主文档中的每个节准备了数据,并循环遍历所有需要的节,每次都使用节Rmd调用knit_child()。
dgtucam13#
我知道这有点晚了,但是我在代码中使用了这个方法来创建编号部分,效果很好。
这使用循环编号(k)来创建子章节编号,然后将其粘贴到章节编号上。2这恰好是在第5节中,但是你可以使用相同的原理来创建无限的章节和子章节。
ddrv8njm4#
在@amit的答案上构建一个关于
knit_child()
使用的示例。根据knitr documentation,可以做一些类似于以下提问的事情:1.将块的输出设置为
as-is
。1.在调用
knitr_child()
之前设置可能在子文档中访问的变量,因为一旦呈现,子文档的环境就与父文档相同。这是我找到的向子文档“传递参数”的唯一方法,但也许有一种更优雅的方法可以做到这一点。1.在列表中存储
knitr_child()
输出。1.使用
cat
将它们依次打印。我已经使用Quarto完成了这项工作,但我认为它应该工作得一样,因为
knitr
是为Rmarkdown而构建的。一个可重复的小示例:
如果您的子文档
child.qmd
如下所示:您可以在主
.qmd
文件中呈现多个不同标题的块,执行如下操作:如果您打算这样做,请考虑保持子文档块未命名,否则重复的名称将使呈现崩溃。