Используйте файл блокировки 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. Затем я хочу добавить эту библиографию через Rmarkdown.

Первую часть можно сделать. Я могу что-то запутать с сопоставлением регулярных выражений, но я подумал, что должен разобрать файл. В пакрате есть внутренняя функция, которую я буду использовать для этого, хотя внутренняя конечно не оптимальна.

Однако я не уверен, как впоследствии объединить цитаты, и я также подумал, что кто-то мог сделать это раньше, отсюда и этот вопрос. Простое объединение их в виде строки может сработать, но, похоже, им не хватает идентификаторов, и мне нужно указать их по идентификатору в файле уценки.


person Ruben    schedule 23.11.2016    source источник
comment
Нашел repmis, который делает что-то подобное, но еще не работает с packrat.   -  person Ruben    schedule 23.11.2016


Ответы (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 = " ")))
person Ruben    schedule 23.11.2016