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