使用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创建的文件缓存/ __包; 有没有办法在没有缓存的情况下自动生成它?
没有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所指出的那样.
所以你想要的是除了基础包和knitr之外加载的所有包。如果我列出所有软件包并排除它们,您将得到您想要的:
p <- setdiff(.packages(),
c("knitr", "stats", "graphics", "grDevices", "utils", "datasets",
"methods", "base"))
p
Run Code Online (Sandbox Code Playgroud)
如果您正在制作有关在knitr中制作东西的knitr文档,或者如果您想显式加载基础包,则必须做出一些例外。