R Markdown如何循环遍历params动态生成模型代码输出文本
实现方法
要适配行数动态变化的参数表批量生成模型说明和对应代码块,直接用knitr的results='asis'块选项即可,不需要硬编码每一段内容,具体做法如下:
- 把遍历参数的逻辑放到单独的R代码块中,给这个块设置两个参数:
echo=FALSE:隐藏遍历用的循环代码,不在最终报告里显示results='asis':告诉knitr直接把R代码输出的内容当做Markdown源码解析,不要转成普通文本
- 在循环里用
cat()按顺序拼接你要输出的说明文字、Markdown格式的代码块标记、拼接好的模型代码即可,注意每段内容前后要留空行,避免Markdown解析失败。
完整可运行示例
对应你给出的params参数表场景,完整Rmd代码如下:
--- title: "Untitled" output: html_document --- ## 批量生成模型说明 ```{r, include=FALSE} # 这里的params可以替换成Shiny传入的动态参数,行数任意 params <- data.frame(id = 1:3, y=rep("Ozone",3), x = c("Solar.R","Wind","Temp + Wind")) ``` ```{r, echo=FALSE, results='asis'} for (i in seq_len(nrow(params))) { # 输出说明文本 cat(sprintf("#### 模型%d\n", params$id[i])) cat("对应执行语法:\n\n") # 输出r代码块,注意代码块前后要加换行 cat("```r\n") cat(sprintf( "id%dModel <- lm(%s ~ %s, data = airquality)", params$id[i], params$y[i], params$x[i] )) cat("\n```\n\n") } ```
适配Shiny传参场景
如果是从theXs、theYs向量取值输出模型说明,把循环部分替换成下面的写法即可:
```{r, echo=FALSE, results='asis'} for (i in seq_along(theYs)) { cat(sprintf("您已使用%s和%s构建模型,对应的执行语法为:\n\n", theXs[i], theYs[i])) cat("```r\n") cat(sprintf("yourModel <- lm(%s ~ %s)", theYs[i], theXs[i])) cat("\n```\n\n") } ```
注意事项
- 所有用
cat()输出的Markdown语法(比如代码块标记、标题标记)前后必须留空行,否则会出现格式错乱、代码块不渲染的问题 - 无论参数表/参数向量有多少条记录,这个写法都能自动适配,不需要手动调整代码
- 如果要让生成的代码实际运行,直接在循环里同步写对应的R执行代码即可,比如在
cat()输出代码后加模型构建语句,就能同时完成模型计算和文档输出。
内容的提问来源于stack exchange,提问作者user111024
相关产品推荐
相关产品推荐

