【问题标题】:How can I tell which packages I am not using in my R script?如何判断我的 R 脚本中没有使用哪些包?
【发布时间】:2020-04-13 15:58:25
【问题描述】:

随着我的代码从一个版本到另一个版本,我知道有一些包我已经为手头的任务找到了更好/更合适的包,或者它们的目的仅限于我的代码部分现已淘汰。

有没有什么简单的方法可以判断给定脚本中实际使用了哪些已加载的包?我的标题开始变得杂乱无章。

【问题讨论】:

  • 我认为这个问题根本无法回答。例如,两个包可能会导出相同的功能,并且 99% 的时间都以相同的方式工作。例如,data.table::between(bit64::as.integer64(235732032595), 0, 1)dplyr::between(bit64::as.integer64(235732032595), 0, 1)
  • @Hugh 当然,R 解释器可以区分,所以原则上,解析工具也应该如此。出于我的目的,我认为这更像是一个边缘案例(如果我在脚本中使用 data.table 或 dplyr 通常很明显),因为陈旧的包往往更加晦涩/定制以运行一个回归等。

标签: r packages


【解决方案1】:

2020 年 4 月 13 日更新

我现在更新了引用函数以使用抽象语法树 (AST),而不是像以前那样使用正则表达式。这是解决问题的一种更强大的方法(它仍然没有完全确定)。这可从funchir 的 0.2.0 版中获得,现在在 CRAN 上。


我刚刚开始编写一个快速而简单的函数来处理这个问题,我称之为stale_package_check,并将它添加到我的包中 (funchir)。

例如,如果我们将以下脚本保存为 test.R:

library(data.table)
library(iotools)
DT = data.table(a = 1:3)

然后(从包含该脚本的目录)运行funchir::stale_package_check('test.R'),我们将得到:

从包data.table匹配的函数:data.table

**没有从 iotools 匹配的导出函数**

【讨论】:

  • 您应该在自述文件中添加以下内容(我知道这对大多数人来说都很明显,但仍然如此):install.packages('devtools'); library(devtools); install_github("MichaelChirico/funchir")
  • @cbartondock 找不到 install_github,在哪里可以找到?
  • 远程包:remote::install_github()
【解决方案2】:

您是否考虑过使用packrat

packrat::clean() 会删除未使用的包,例如。

【讨论】:

  • 安装一个包来帮助解决这个问题似乎有点违反直觉!我在运行packrat::init() 时遇到了麻烦,因为我刚刚重新安装了 R——我认为它正在寻找我尚未重新安装的软件包。这似乎是最量身定制的解决方案,当我在本地解决问题时会接受
  • 我是否更正packrat::init() 在当前工作目录中查找当前工作目录中的 all R 文件。这不是我想要的……很接近,但并不完全。
【解决方案3】:

我编写了一个命令行脚本来完成这项任务。您可以在this Github gist 中找到它。我确信它会遗漏一些边缘情况,但它在 R 脚本和 Rmd 文件上都运行良好。

【讨论】:

    【解决方案4】:

    我的方法总是关闭我的 R 脚本或 IDE(即 RStudio),然后重新启动它。 在此之后,我运行我的函数而不预先加载任何依赖项/包。 这应该会导致各种警告和错误消息,告诉您哪些功能无法找到和执行。这将再次提示您需要预先加载哪些包以及可以省略哪些包。

    【讨论】:

    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 2011-07-08
    • 2011-03-27
    • 2011-01-24
    • 2011-02-26
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多