如何使用同一个 R 包的多个版本?

为了能够比较软件包的两个版本,我需要能够选择我加载的软件包的哪个版本。默认情况下,R 的软件包系统被设置为覆盖现有的软件包,这样您总是拥有最新的版本。我如何覆盖这种行为?

到目前为止,我的想法是:

我可以获得包源,编辑描述以给出不同的名称,并实际上构建两个不同的包。不过,我更愿意直接使用二进制文件,因为这样麻烦少得多。

我不一定需要同时加载两个版本的软件包(只是同时安装在某个地方)。我也许可以使用 Sys.getenv('R_HOME')来更改 R 安装包的位置,然后使用 .libpaths()来更改 R 查找包的位置。不过这看起来有点古怪,有人有更好的主意吗?

24272 次浏览

您可以有选择地更改库路径。为了完全透明,不要让这两者都出现在你通常的路径上,然后去做

 library(foo, lib.loc="~/dev/foo/v1")    ## loads v1

还有

 library(foo, lib.loc="~/dev/foo/v2")    ## loads v2

当然,install.packages()也是如此。所有这些命令都有许多参数,因此您瞄准的钩子可能已经存在。因此,不要考虑更改 R_HOME,而是考虑 help(install.packages)(假设您是从源代码安装的)。

但是 AFAIK 不能在同一名称下加载同一个包两次。

许多年过去了,这个被接受的答案当然仍然有效。不过,值得一提的是,在此期间出现了一些新的选择:

管理包的多个版本

对于在项目(目录)级别上管理多个版本的包,packrat工具可能很有用: https://rstudio.github.io/packrat/

Packrat 通过在项目目录中存储包依赖项来增强项目目录,而不是依赖于跨所有其他 R 会话共享的个人 R 库。

这基本上意味着每个项目都可以有自己的“私有库”,与用户和系统库隔离。如果您正在使用 RStudio,那么 packrat的集成非常巧妙,并且易于使用。

安装自定义包版本

在安装自定义版本的软件包方面,有很多方法,也许最方便的方法是使用 Devtools软件包,例如:

devtools::install_version("ggplot2", version = "0.9.1")

或者,正如 Richie 建议的那样,现在有一个更轻量级的软件包 遥控器,它是 devtools 分解成更小的软件包的结果,用法非常相似:

remotes::install_version("ggplot2", version = "0.9.1")

关于这个主题的更多信息可以找到:

我和 R 一起工作了很长时间,直到今天我才开始思考这个问题。这个想法来自于我开始涉足 Python 的事实,我必须做的第一步是管理他们(pythonistas)所称的“虚拟环境”。他们甚至有专门的工具来完成这个看似重要的任务。我告诉自己更多关于这方面的知识,以及他们为什么如此认真对待这个问题。我最终意识到,这是管理具有冲突依赖关系的不同项目的一种简洁而重要的方法。我想知道为什么 R 没有这个特性,并且发现实际上“环境”的概念存在于 R 中,但是并没有像 Python 那样介绍给新手。因此,您需要检查有关这方面的文档,它将解决您的问题。 不好意思,我没说清楚,但我觉得会有帮助。