Как получить список пакетов, используемых в документе knitr.Rnw?
Использование RStudio → CompilePDF
В документе .Rnw, который будет обрабатываться с помощью pdflatex, я хотел бы получить список всех
(me), загруженные через библиотеку() или require() в документе. Я пытался
для использования sessionInfo(), как в
\AtEndDocument{
\medskip
\textbf{Packages used}: \Sexpr{names(sessionInfo()$loadedOnly)}.
}
однако, то, что это печатает, - это только список пакетов, используемых самим самим нарядом,
Используемые пакеты: дайджест, оценка, форматR, highr, stringr, инструменты.
не те, о которых я прямо упоминал. Я считаю, что это потому, что
кодовые фрагменты внутри внутренней среды, но я не знаю, как получить к ней доступ.
Я знаю о файлах кеша /__ пакетов, созданных с кешем = ИСТИНА; здесь
любой способ генерировать это автоматически без кеширования?
Ответы
Ответ 1
Без кеша (cache = FALSE
) то, что вы хотите, в основном
unique(c(.packages(), loadedNamespaces()))
С включенным кешем он немного сложнее, поскольку имена пакетов также кэшируются; во второй раз, когда вы компилируете документ, эти пакеты не загружаются, если вы не сделали недействительным кеш. В этом случае, как вы заметили, есть файл cache/__packages
, и вы можете прочитать имена пакетов там, поэтому
unique(c(.packages(), loadedNamespaces(), readLines('cache/__packages')))
Вы можете сделать код более надежным (например, проверить, существует ли cache/__packages
), и исключить определенные пакеты из списка (например, knitr
и его друзей), как отметил @sebastian-c.
Ответ 2
Проблема с этим подходом заключается в том, что \Sexpr {} в блоке \AtEndDocument {} в преамбуле оценивается в
(начало файла .Rnw, поэтому он возвращает пустой список. В сгенерированном файле .tex это выглядит как
\AtEndDocument{
\medskip
\textbf{Packages used}: .
}
Единственный способ, с помощью которого это будет работать, - включить код для генерации этого текста явно в конце .Rnw файла
(что в моем случае является дочерним докуменем, например,
...
\bibliography{graphics,statistics}
Inside child document:
\textbf{Packages used}: \Sexpr{setdiff(.packages(),
c("knitr", "stats", "graphics", "grDevices", "utils", "datasets",
"methods", "base"))}.
Ответ 3
Так что вы хотите, это все пакеты, которые загружаются, кроме базовых пакетов и knitr. Если я затем перечислил все пакеты и исключил их, вы получите то, что хотите:
p <- setdiff(.packages(),
c("knitr", "stats", "graphics", "grDevices", "utils", "datasets",
"methods", "base"))
p
Вы должны сделать некоторые исключения, скажем, если вы делаете документ knitr о том, чтобы делать что-то в knitr, или если вы хотите явно загружать базовые пакеты.