如何获取knitr .Rnw文档中使用的包列表?

use*_*089 10 latex r knitr

使用RStudio - > CompilePDF

在使用pdflatex处理的.Rnw文档中,我想获得通过文档中的library()或require()加载的所有用户(me)包的列表.我尝试使用sessionInfo(),如

   \AtEndDocument{
   \medskip
   \textbf{Packages used}: \Sexpr{names(sessionInfo()$loadedOnly)}.
   }
Run Code Online (Sandbox Code Playgroud)

然而,这打印的只是knitr本身使用的包列表,

使用的包:digest,evaluate,formatR,highr,stringr,tools.

不是我明确提到的那些.我相信这是因为knitr在内部环境中运行代码块,但我不知道如何访问它.

我知道使用cache = TRUE创建的文件缓存/ __包; 有没有办法在没有缓存的情况下自动生成它?

Yih*_*Xie 9

没有cache(cache = FALSE),基本上你想要的是什么

unique(c(.packages(), loadedNamespaces()))
Run Code Online (Sandbox Code Playgroud)

启用缓存后,它会稍微复杂一些,因为包名称也会被缓存; 第二次编译文档时,除非您使缓存失效,否则不会加载这些包.在这种情况下,正如您所注意到的,有一个文件cache/__packages,您可以在那里读取包名称,所以

unique(c(.packages(), loadedNamespaces(), readLines('cache/__packages')))
Run Code Online (Sandbox Code Playgroud)

您可能希望使代码更健壮(例如,检查是否cache/__packages存在),并从列表中排除某些包(例如knitr及其朋友),如@ sebastian-c所指出的那样.


seb*_*n-c 1

所以你想要的是除了基础包和kn​​itr之外加载的所有包。如果我列出所有软件包并排除它们,您将得到您想要的:

p <- setdiff(.packages(), 
        c("knitr", "stats", "graphics", "grDevices", "utils", "datasets", 
          "methods", "base"))
p
Run Code Online (Sandbox Code Playgroud)

如果您正在制作有关在knitr中制作东西的knitr文档,或者如果您想显式加载基础包,则必须做出一些例外。