使用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创建的文件缓存/ __包;在那儿 没有缓存的任何方式自动生成?
答案 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"))}.