1

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

锁定文件具有这种格式。

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 文件中的标识符来提及它们。

4

1 回答 1

1

我想出了以下内容。我还不开心。
一个丑陋的组合是通过 str_replace 包含包名称作为 bibtex 标识符。
另一个问题是我需要生成 nocite 字符串并将其手动粘贴到我的 .Rmd 文件中。
此外,许多包的引用不包括其精确的版本号,但锁定到特定版本是 packrat 增加的价值。我仍然可以向人们推荐锁定文件以获取更多信息,但我可能会尝试自己将此信息添加到 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 = "\n\n")

# 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 = " ")))
于 2016-11-23T17:36:34.577 回答