Используйте packrat lockfile для генерации цитат
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.
Первая часть может быть сделана. Я могу что-то запутать с сопоставлением с Regex, но я подумал, что мне нужно разобрать файл. В пакрате есть внутренняя функция, которую я буду использовать для этого, хотя внутренняя, конечно, не оптимальна.
Тем не менее, я не уверен, как объединить цитаты впоследствии, и я также думал, что кто-то мог сделать это раньше, отсюда и этот вопрос. Простое объединение их в виде строки может работать, но у них, похоже, нет идентификаторов, и мне нужно упомянуть их по идентификатору в файле уценки.
1 ответ
Я придумал следующее. Я еще не счастлив.
Одним из отвратительных препятствий является включение имени пакета в качестве идентификатора bibtex через str_replace.
Другая проблема заключается в том, что мне нужно сгенерировать строку 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 = " ")))