能否通过单次Knit操作生成两个内容一致但文件名不同的HTML文件?
单次Knit生成两个HTML文件的解决方案
解决思路:借助knitr的后置钩子功能,在渲染出带时间戳的历史版本文件后,自动复制一份到指定的共享文件名,一次Knit操作完成全部需求,无需重复运行或手动复制文件。
实现步骤
在RMD文件开头添加配置代码
新建一个隐藏代码块(echo=FALSE避免输出代码内容),写入以下逻辑:library(knitr) library(rmarkdown) # 生成带时间戳的复杂文件名:原文件名_年月日_时分秒.html input_file <- current_input() base_name <- tools::file_path_sans_ext(basename(input_file)) timestamp <- format(Sys.time(), "%Y%m%d_%H%M%S") complex_filename <- paste0(base_name, "_", timestamp, ".html") # 设置后置钩子:渲染完成后复制文件到指定简化名 knit_hooks$set(post_knit = function(x, options) { simplename <- "_Readme-topic.html" file.copy(from = complex_filename, to = simplename, overwrite = TRUE) return(x) }) # 指定渲染输出为带时间戳的文件名 opts_chunk$set(output_file = complex_filename)YAML输出配置
保持HTML输出格式,无需指定固定文件名:--- title: "你的文档标题" output: html_document ---
效果说明
点击一次Knit按钮后,会自动生成两个HTML文件:
- 历史版本:
原文件名_YYYYMMDD_HHMMSS.html(包含原文件名、精确时间戳,用于留存历史记录) - 共享版本:
_Readme-topic.html(固定简化名称,方便对外共享)
注意事项
- 确保已安装
knitr和rmarkdown包,未安装的话先运行install.packages(c("knitr", "rmarkdown")) - 若要修改复杂文件名的格式,调整
timestamp的format参数即可,比如改成%Y-%m-%d_%H-%M-%S带横杠的格式 overwrite = TRUE会覆盖已存在的共享文件,若需保留旧的共享版本,可将该参数改为FALSE(此时存在同名文件时会报错,需手动处理)
内容的提问来源于stack exchange,提问作者Mark Friedman
相关产品推荐
相关产品推荐

