R-使用Packrat Lockfile生成引用



packrat生成一个锁定文件,其中所有在存储库中实际使用的软件包(包括依赖项)。我认为使用此锁定文件为项目网站生成我的引用。

Lockfile具有此格式。

PackratFormat: 1.4
PackratVersion: 0.4.8.1
RVersion: 3.3.0
Repos: CRAN=https://cran.rstudio.com/
Package: BH
Source: CRAN
Version: 1.62.0-1
Hash: 14dfb3e8ffe20996118306ff4de1fab2
Package: DT
Source: CRAN
Version: 0.2
Hash: 36b032203797956fedad5a25055016a9
Requires: htmltools, htmlwidgets, magrittr

等。我想最终获得一个Bibtex文件,其中包括所有软件包 R和Packrat版本的引用。然后,我想通过RmarkDown附加此参考书目。

可以完成第一部分。我可以将一些与正则匹配的东西相匹配,但我认为我应该解析文件。packrat中有一个内部功能,我将用于此功能,尽管内部当然不是最佳的。

但是,我不确定如何加入引用,我也认为有人可能会这样做,因此这个问题。简单地将它们连接为字符串可能会起作用,但是它们似乎缺乏标识符,我需要在Markdown文件中的标识符提及它们。

我想到了以下内容。我还不开心。
一个丑陋的kludge是包含包装名称作为bibtex标识符,通过str_replace。
另一个是我需要生成nocite字符串并手动将其手动粘贴到我的.rmd文件中的问题。
此外,许多软件包的引用不包括其精确的版本号,但是锁定到特定版本的是Packrat添加的值。我仍然可以将人们推荐给Lockfile以获取更多信息,但是我可能会尝试将此信息本人添加到Bibtex。在查看了我以前从未见过的一系列包装列表之后,我觉得我需要一个选项将其限制在我实际上称自己的包裹中。

library(stringr)
# use internal function to read lockfile (uses readDcf)
packages = packrat:::readLockFilePackages("packrat/packrat.lock")
package_names = names(packages) # get pkg names

getbib = function(...) { # small helper to extract citations
    # allow calling it with no argument to get R citation
    name = list(...)
    if (length(name) > 0) {
        name = name[[1]]
    } else {
        name = "R"
    }
    paste0(
        str_replace(
            as.character(toBibtex(citation(...))),
            # by default the bibtex entries dont have ids, I'm using the pkg name
            "\{\,", paste0( "{", name, ",")) ,
        collapse = "n")
}
bibliography = paste0(c(
    getbib(), sapply(package_names, FUN = getbib)), # get R citation and all packages
    collapse = "nn")
# write bibliography to file
cat(bibliography, file = "packrat_bibliography.bibtex")
# generate YAML reference with nocite
cat(paste0("
bibliography: packrat_bibliography.bibtex
nocite: |
", paste0("@", c("R", package_names), collapse = " ")))

最新更新