使用packrat lockfile生成引用

时间:2016-11-23 16:49:41

标签: r citations packrat

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版本。 然后我想要append this bibliography via Rmarkdown

第一部分可以完成。我可以使用Regex匹配来解决问题,但我认为我应该解析文件。我将使用packrat中的内部函数,尽管内部函数当然不是最佳的。

但是,我不确定如何连接之后的引文,我也认为有人可能之前已经这样做了,因此这个问题。简单地将它们连接成一个字符串可能会有效,但它们似乎缺少标识符,我需要通过markdown文件中的标识符来提及它们。

1 个答案:

答案 0 :(得分: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 = " ")))