【问题标题】:Dependency management in RR中的依赖管理
【发布时间】:2011-12-05 12:32:06
【问题描述】:

R 是否有依赖管理工具来促进项目特定的依赖?我正在寻找类似于 Java 的 maven、Ruby 的 bundler、Python 的 virtualenv、Node 的 npm 等的东西。

我知道DESCRIPTION文件中的“Depends”子句以及R_LIBS工具,但它们似乎不能协同工作,无法为一些非常常见的工作流程提供解决方案。

我基本上希望能够签出一个项目并运行一个命令来构建和测试该项目。该命令应将任何所需的包安装到特定于项目的库中,而不会影响全局 R 安装。例如:

my_project/.Rlibs/*

【问题讨论】:

  • 查看 R 包 ProjectTemplatedevtools
  • ProjectTemplate 不支持此功能。文档说这些库必须已经安装:“库:这是用户希望在调用 load.project() 时自动加载的所有 R 包的逗号分隔列表。这些包必须在调用 load 之前已经安装.project()。默认情况下,reshape、plyr、ggplot2、stringr 和 lubridate 包都包含在此列表中。"
  • 看起来 devtools 有一些很棒的东西,但它也没有做到这一点。
  • 我认为你想要的在 R 中是非常可行的,但还没有人做到。
  • 如果您想要开发工具解决方案,dev_mode(); install_deps("path/to/package"); check() 非常接近。

标签: r dependencies package


【解决方案1】:

您可以使用以下工作流程:

1) 创建一个脚本文件,其中包含您要设置的所有内容并将其存储在您的项目目录中,例如项目初始化.R

2) 使用 try 语句从您的 .Rprofile(或 R 在启动时执行的任何其他文件)中获取此脚本

try(source("./projectInit.R"), silent=TRUE)

这将保证即使没有找到 projectInit.R,R 也会在没有错误消息的情况下启动

3) 如果您在项目目录中启动 R,则 projectInit.R 文件将被获取(如果该目录中存在)并且您已准备好开始

这是从 Linux 的角度来看的,但在 windows 和 Mac 下也应该以相同的方式工作。

【讨论】:

  • 抱歉 - 我还没有看到“安装”部分。我必须在这里和 Dirk 一起去 - 这必须特定于一个平台,但是有例如一个方便的 bash 脚本,它可能实现你想要的一切(与上述 projectInit.R 文件的来源一致。
【解决方案2】:

不幸的是,DESCRIPTION: 文件中的Depends: 是您所获得的全部内容,原因如下:

  • R 本身是合理的跨平台,但这意味着我们需要它跨平台和操作系统工作
  • Encoding Depends:R 包之外需要在操作系统中以可移植的方式对 Depends 进行编码——祝你好运,即使是简单的东西,例如“PNG 图形库”,也可以以一种可以跨系统明确解决
  • Windows 没有包管理器
  • AFAIK OS X 没有包管理器来混合 Apple 发布的内容和其他开源项目提供的内容
  • 即使在 Linux 发行版中,您也无法获得一致性:仅以 RStudio 为例,它包含在 RedHat/Fedora 和 Debian/Ubuntu 的两个包中(它们都提供了它们的依赖项!)

这是一个难题。

【讨论】:

  • 致那些有礼貌地在不发表评论的情况下投反对票的人:你做错了。只有有了 cmets,我们才能进行每个人都可以学习的讨论。随机投票对任何人都没有帮助。
【解决方案3】:

作为权宜之计,我编写了一个新的rbundler 包。它将项目依赖项安装到项目特定的子目录中(例如<PROJECT>/.Rbundle),允许用户避免使用全局库。

我们已经在 Opower 使用 rbundler 几个月了,并且在开发人员工作流程、可测试性和内部包的可维护性方面看到了巨大的改进。结合我们的内部包存储库,我们已经能够稳定开发十几个用于生产应用程序的包。

一个常见的工作流程:

  • 从 github 查看项目
  • cd 进入项目目录
  • 启动 R
  • 从 R 控制台:

    库(rbundler)

    捆绑('.')

所有的依赖都会被安装到./.Rbundle,并且会创建一个.Renviron文件,内容如下:

R_LIBS_USER='.Rbundle'

在此项目目录中运行的任何 R 操作都将遵循项目特定的库和包依赖项。请注意,虽然此方法使用包说明来定义依赖关系,但它不需要具有实际的包结构。因此,rbundler 成为管理 R 项目的通用工具,无论是简单的脚本还是成熟的包。

【讨论】:

  • 在我看来,这正是 PackRat(rstudio.github.io/packrat) 所做的,最近由 RStudio 团队发布。我错了吗?
  • 感谢@jhin 提出这个问题。在我开始开发rbundler 的时候,我与@hadley 和RStudio 的人们讨论了这个问题。不同之处在于 rbundler 专注于 package 开发,并利用 DESCRIPTION 文件中的显式依赖关系,而 PackRat 专注于一般项目开发,并通过反射。 PackRat 有一些额外的功能来快照你的依赖关系,以便于部署和共享。我相信这是他们作为管理托管项目的解决方案的首要任务。
  • 啊,我明白了。我只是想了解使用 rbundler 的包部署工作流程,但我不太确定我是否正确。假设我已经开发了一个包,并将它的依赖项与 rbundler 捆绑在一起。当有人安装我的包时会发生什么,例如使用 miniCRAN 中的 devtools 'install("mypack")'(假设这就是“我们的内部包存储库”的意思)?包依赖是如何解决的?
  • 附带问题:如何使用 rbundler 存储包?我知道 PackRat 主要以源代码形式存储包,以便使依赖项可移植到不同的平台。 rbundler如何解决这个问题? (也许您想在项目的 GitHub / CRAN 页面上包含这些信息?至少我无法在那里找到这些问题的任何答案。)
  • rbundler 没有对包做任何花哨的事情,它只是管理一个特定于项目的library,并将包安装到那里。正如这里的答案中提到的,该库是通过覆盖 R 的标准 R_LIBS_USER 来配置的。也许我应该从 README 链接到 R 的库管理配置。
【解决方案4】:

packrat 包正是为了实现以下目标:

在不影响全局 R 安装的情况下将任何所需的包安装到特定于项目的库中

它允许在不同的项目本地包库中安装相同包的不同版本。

即使这个问题已有 5 年的历史,我也会添加这个答案,因为在提出问题时,这个解决方案显然还不存在(据我所知,packrat first appeared on CRAN in 2014)。

更新(2019 年 11 月)

新的 R 包 renv 替换了 packrat

【讨论】:

  • 谢谢纪尧姆。请参阅我对已接受答案中类似评论的回复。事情很可能发生了变化,因此请随时发表评论。
  • 谢谢,我在发布之前错过了上面的评论。但我认为通过答案给予 Packrat 可见性是相关的(很容易忽略 cmets)。
  • 同意。谢谢,纪尧姆。 :)
猜你喜欢
  • 2013-04-23
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2015-10-13
  • 2021-11-18
  • 2021-09-09
相关资源
最近更新 更多