将 .rmd/.qmd 文件渲染为 pdf 时包括自动增量文件版本控制

问题描述 投票:0回答:1

在 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 visual-studio-code yaml r-markdown markdown
1个回答
0
投票

您可以做的一件事是将版本号作为参数存储在 R Markdown 文件中,然后使用外部 R 脚本渲染 R Markdown 文件。

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)
```

R 脚本的内容

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 文件。

输出

© www.soinside.com 2019 - 2024. All rights reserved.