R中的依赖关系管理
R是否有依赖关系管理工具来促进项目特定的依赖关系?我正在寻找类似于Java的maven、Ruby的bundler、Python的virtualenv、Node的npm等的东西 我知道描述文件中的“Depends”子句,以及R_LIBS工具,但它们似乎无法为一些非常常见的工作流提供解决方案 我基本上希望能够签出一个项目并运行单个命令来构建和测试该项目。该命令应在不影响全局R安装的情况下,将任何必需的包安装到特定于项目的库中。例如:R中的依赖关系管理,r,dependencies,package,R,Dependencies,Package,R是否有依赖关系管理工具来促进项目特定的依赖关系?我正在寻找类似于Java的maven、Ruby的bundler、Python的virtualenv、Node的npm等的东西 我知道描述文件中的“Depends”子句,以及R_LIBS工具,但它们似乎无法为一些非常常见的工作流提供解决方案 我基本上希望能够签出一个项目并运行单个命令来构建和测试该项目。该命令应在不影响全局R安装的情况下,将任何必需的包安装到特定于项目的库中。例如: my_project/.Rlibs/* 您可以使用以下工作流:
my_project/.Rlibs/*
您可以使用以下工作流: 1) 创建一个脚本文件,其中包含要设置的所有内容,并将其存储在projectd目录中,例如projectnit.R 2) 使用try语句从.Rprofile(或R在启动时执行的任何其他文件)中获取此脚本
try(source("./projectInit.R"), silent=TRUE)
这将保证即使没有找到projectInit.R,R也会在没有错误消息的情况下启动
3) 如果在项目目录中启动R,则projectnit.R文件将在目录中存在且您已准备就绪的情况下被源化
这是从Linux的角度来看的,但在windows和Mac下也应该以同样的方式工作。不幸的是,
依赖于:描述中的:
文件是您得到的所有文件,原因如下:
- R本身是跨平台的,但这意味着我们需要它来跨平台和OSs工作
- 编码依赖项:beyond R软件包要求以跨操作系统的可移植方式对依赖项进行编码——祝你好运,即使是“PNG图形库”这样简单的东西,也能以一种可以跨系统明确解析的方式进行编码
- Windows没有包管理器
- AFAIK OS X没有一个软件包管理器,它混合了苹果提供的软件和其他开源项目提供的软件
- 即使在Linux发行版中,您也无法获得一致性:以RStudio为例,它包含两个包(都提供了它们的依赖关系!),分别用于RedHat/Fedora和Debian/Ubuntu
这是一个难题。作为权宜之计,我写了一个新的包。它将项目依赖项安装到特定于项目的子目录中(例如,/.Rbundle
),使用户可以避免使用全局库
- 关于Github
- 在起重机上
我们已经在Opower使用了几个月的rbundler
,在开发人员工作流程、可测试性和内部包的可维护性方面都有了巨大的改进。结合我们的内部软件包存储库,我们已经能够稳定地开发十几个用于生产应用程序的软件包
通用工作流:
- 从github签出一个项目
- 将cd放入项目目录中
- 点火
- 从R控制台:
图书馆(rbundler)
束('.'))
所有依赖项都将安装到/.Rbundle
,并将创建一个.Renviron
文件,其中包含以下内容:
R_LIBS_USER='.Rbundle'
在此项目目录中运行的任何R操作都将遵循项目专用库和包依赖项。注意,虽然此方法使用包描述来定义依赖项,但它不需要实际的包结构。因此,rbundler
成为管理R项目的通用工具,无论是简单的脚本还是完整的包。该包正是为了实现以下目标:
在不影响全局R安装的情况下,将任何必需的包安装到特定于项目的库中
它允许在不同的项目本地包库中安装相同包的不同版本
即使这个问题已经5年了,我还是添加了这个答案,因为这个解决方案显然在问题提出时还不存在(据我所知,)
更新(2019年11月)
新的R包已被替换packrat
请查看R包ProjectTemplate
和devtools
。ProjectTemplate不支持此功能。文档中说必须已经安装了这些库:“库:这是一个逗号分隔的列表,列出了在调用load.project()时用户希望自动加载的所有R包。在调用load.project()之前,必须已经安装了这些包。默认情况下,重塑、plyr、ggplot2、stringr和lubridate包都包含在这个列表中。“看起来devtools有一些很棒的东西,但它在这方面也有不足。我认为您想要的东西在R中完全可行,但还没有人做到。如果您想要一个devtools解决方案,dev_mode();安装_deps(“路径/到/包”);check()
非常接近。对不起,我还没有看到“安装”部分。我必须在这里使用Dirk-这必须是特定于某个平台的,但是有一个bash脚本,它可能实现您想要的所有功能(与上述projectInit.R文件的来源相一致。对于有礼貌地对其进行否决而不留下评论的人:你做错了。只有发表评论,我们才能进行讨论,每个人都可以学习。通过否决票随机驾驶对任何人都没有帮助。在我看来,这正是Pac所做的克拉特()是的,最近由RStudio团队发布。我错了吗?谢谢你提出这个问题,@jhin。在我开始开发rbundler
时,我与@hadley和RStudio的人谈过这一点。区别在于rbundler
专注于包开发,并利用了显式依赖在你的描述
文件中,你的依赖关系是不完整的,而PackRat
专注于一般的项目开发,并通过反射导出你的依赖关系