如何通过编程方式生成已预设参数值的.rmd文件
方案1:使用knitr::knit_expand(最推荐,灵活度高)
你可以给Rmd模板设置自定义占位符,通过代码传入参数自动填充后生成新的Rmd文件,步骤如下:
- 准备模板文件
report_template.Rmd,将需要动态替换的参数用占位符标记(这里以默认的{{参数名}}为例):
--- title: "Dynamic report" output: html_document params: n: {{n}} --- ```{r} # The `params` object is available in the document. params$n
2. 运行代码填充参数并生成最终Rmd文件: ```r library(knitr) # 传入参数渲染模板内容 filled_rmd <- knit_expand("report_template.Rmd", n = 40) # 写入为新的Rmd文件 writeLines(filled_rmd, con = "filled_report.Rmd")
如果担心占位符和R代码里的大括号冲突,可以自定义分隔符,比如用<% %>作为占位符标记:
# 渲染时指定分隔符 filled_rmd <- knit_expand("report_template.Rmd", n = 40, delimiter = c("<%", "%>"))
对应的模板里参数位写为n: <%n%>即可。
如果是在Shiny场景下使用,可以直接配合downloadHandler给用户提供填充后Rmd的下载:
output$download_rmd <- downloadHandler( filename = function() "custom_report.Rmd", content = function(file) { filled_rmd <- knit_expand("report_template.Rmd", n = input$n) writeLines(filled_rmd, con = file) } )
方案2:动态解析修改YAML头(无需修改原有模板结构)
如果你的原有模板里参数位已经写为默认的NA,不想调整模板加占位符,可以用yaml包自动读取、修改YAML头后拼接生成新文件,全程不需要手动修改文件内容:
library(yaml) # 读取原模板所有行 rmd_lines <- readLines("original_template.Rmd") # 定位YAML头的前后分隔线 yaml_pos <- which(rmd_lines == "---") # 解析YAML内容 yaml_content <- yaml.load(paste(rmd_lines[(yaml_pos[1]+1):(yaml_pos[2]-1)], collapse = "\n")) # 替换参数值 yaml_content$params$n <- 40 # 拼接新的Rmd内容 new_rmd <- c( "---", as.yaml(yaml_content), "---", rmd_lines[(yaml_pos[2]+1):length(rmd_lines)] ) # 写入新文件 writeLines(new_rmd, con = "filled_report.Rmd")
内容的提问来源于stack exchange,提问作者All Downhill From Here
相关产品推荐
相关产品推荐

