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

时间:2013-09-29 23:15:40

标签: r latex knitr

使用RStudio - > CompilePDF

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

   \AtEndDocument{
   \medskip
   \textbf{Packages used}: \Sexpr{names(sessionInfo()$loadedOnly)}.
   }

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

  

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

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

我知道使用cache = TRUE创建的文件缓存/ __包;在那儿 没有缓存的任何方式自动生成?

3 个答案:

答案 0 :(得分:9)

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

unique(c(.packages(), loadedNamespaces()))

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

unique(c(.packages(), loadedNamespaces(), readLines('cache/__packages')))

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

答案 1 :(得分:1)

所以你想要的是除了基本包和knitr之外所有加载的包。如果我然后列出所有包并排除它们,你会得到你想要的:

p <- setdiff(.packages(), 
        c("knitr", "stats", "graphics", "grDevices", "utils", "datasets", 
          "methods", "base"))
p

如果您正在制作关于在knitr中制作内容的编辑文档,或者您想明确加载基础包,那么您必须做出一些例外。

答案 2 :(得分:1)

这种方法的问题在于前导码中\ AtEndDocument {}块内的\ Sexpr {}在 编织时间(.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"))}.