10

使用 RStudio --> 编译 PDF

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

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

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

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

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

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

4

4 回答 4

10

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

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

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

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

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

于 2013-09-30T02:26:34.463 回答
1

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

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

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

于 2013-09-30T02:19:35.253 回答
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"))}.
于 2013-09-30T13:58:40.533 回答
0

一种不同的,也许更明确和详细的方法,扩展了之前给出的答案。这将出现在\backmatter一本书中。该值nColOut是包含使用的包列表的打印表的列数。

\cleardoublepage
\printindex

\cleardoublepage

\chapter*{Packages}

<<packages, cache = FALSE, echo = FALSE, warning = FALSE, results = "asis">>=
nColOut = 7
packsAll <- unique(c(.packages(), loadedNamespaces(), readLines('cache/__packages')))
packsReduced <- setdiff(packsAll,
  c("knitr", "stats", "graphics", "grDevices", "utils", "datasets", "methods", "base"))
howManyPacks <- packsReduced %>%
  length()
numLines <-
  tibble(numPacks = howManyPacks + 0:(nColOut - 1),
    n = numPacks %% nColOut)
howManyToAdd <- numLines %>%
  filter(n == 0) %>%
  mutate(diff = numPacks - howManyPacks) %>%
  pull(diff)
packsReduced %>%
  sort() %>%
  as_tibble() %>%
  add_row(value = rep('', howManyToAdd)) %>%
  mutate(id = rep(1:(length(value) / nColOut), nColOut),
    col =  rep(letters[1 : nColOut], each = length(value) / nColOut)) %>%
  pivot_wider(names_from = col, values_from = value) %>%
  select(-id) %>%
  kable("latex", booktabs = TRUE, longtable = TRUE) %>%
  kable_styling(latex_options = "repeat_header") %>%
  row_spec(0, align = "c")
@
于 2021-12-03T02:19:16.007 回答