Как получить список пакетов, используемых в документе 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, или если вы хотите явно загружать базовые пакеты.