【问题标题】:How to get list of packages used in a knitr .Rnw document?如何获取 knitr .Rnw 文档中使用的软件包列表?
【发布时间】:2013-10-05 17:39:16
【问题描述】:

使用 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;有没有 有什么方法可以在不缓存的情况下自动生成?

【问题讨论】:

    标签: r latex knitr


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        这种方法的问题是序言中 \AtEndDocument{} 块中的 \Sexpr{} 被评估为 knit-time (.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"))}.
        

        【讨论】:

        • 您不应将 LaTeX 编程与 R 编程混用。 R/knitr 不知道 LaTeX 语法。如果你想避免重复这部分文档,你可以把它放在一个子文档中,这样它就可以被所有文档重复使用。
        【解决方案4】:

        一种有些不同,也许更明确和详细的方法,扩展了之前给出的答案。这将出现在一本书的\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")
        @
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-08
          • 1970-01-01
          • 2014-07-03
          • 1970-01-01
          • 2016-09-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多