在 markdown/rmarkdown/quarto 中工作时,有没有办法包含自动增量文档版本控制?当我第一次将文件渲染为 pdf 时,我希望它显示版本 1.0,并在每次更新 pdf 时从那里向上递增。这有可能吗?
我尝试包含一个基于缓存文件存在的自定义函数,但它不起作用。似乎 YAML 标头选项“版本”不被接受(我真的说服自己接受了)。
这是我的 YAML 标头:
---
标题:“项目:示例”
日期:“2024 年 4 月”
文档类别:报告
版本:1.0
---
这是我的职责:
cache_dir <- "./cache"
# Function to increment and return version number
version_number <- function() {
if (!file.exists(file.path(cache_dir, ".RData"))) {
version <- 1.0
save(version, file = file.path(cache_dir, ".RData"))
} else {
load(file = file.path(cache_dir, ".RData"))
version <- get("version") + 1.0
save(version, file = file.path(cache_dir, ".RData"))
}
return(paste0("v", version))
}
这也行不通:
---
标题:“项目:示例”
日期:“2024 年 4 月”
文档类别:报告
版本:1.0
---
有谁知道我如何实现这种行为?我不是在寻找像 Git 这样的版本控制,我正在使用 Visual Studio Code(如果有帮助的话)。谢谢!
您可以做的一件事是将版本号作为参数存储在 R Markdown 文件中,然后使用外部 R 脚本渲染 R Markdown 文件。
---
title: "Project: Example"
output: pdf_document
date: "April 2024"
params:
version: 1
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{r}
sprintf("The current version of this document is %i.", params$version)
```
get_version <- function(x) {
src <- readLines(x)
version_line <- grep(" version: \\d+", src)
as.numeric(sub(" version: ", "", src[version_line]))
}
set_version <- function(x, v) {
src <- readLines(x)
version_line <- grep(" version: \\d+", src)
src[version_line] <- sprintf(" version: %i", v)
writeLines(src, x)
}
increment_version <- function(x) {
version <- get_version(x)
set_version(x, version + 1)
}
render <- function(input, ...) {
increment_version(input)
rmarkdown::render(input, ...)
}
render("C:/Users/the-mad-statter/Documents/my_r_markdown.Rmd")
编辑 R 脚本以指向所需的 R Markdown 文件后,您可以运行它。该脚本将更新版本号,然后渲染 R Markdown 文件。