Используйте 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 = " ")))
Другие вопросы по тегам