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

Ric*_*ton 57 versioning packages r

为了能够比较包的两个版本,我需要能够选择我加载的包的版本.R的软件包系统默认设置为覆盖现有软件包,因此您始终拥有最新版本.如何覆盖此行为?

到目前为止我的想法是:

我可以获取包源,编辑描述以提供不同的名称,并实际构建两个不同的包.我宁愿能够直接使用二进制文件,因为它不那么麻烦.

我不一定需要同时加载两个版本的软件包(只是同时安装在某个地方).我或许Sys.getenv('R_HOME')可以改变R安装包.libpaths()的地方,然后改变R寻找它们的地方.这看起来很酷,所以有没有人有更好的想法?

Dir*_*tel 58

您可以有选择地更改库路径.为了完全透明,请将两者都放在通常的路径之外,然后再做

 library(foo, lib.loc="~/dev/foo/v1")    ## loads v1
Run Code Online (Sandbox Code Playgroud)

 library(foo, lib.loc="~/dev/foo/v2")    ## loads v2
Run Code Online (Sandbox Code Playgroud)

install.packages()当然,这同样适用.所有这些命令都有许多参数,因此您所针对的钩子可能已经存在.所以不要看改变R_HOME,而是看help(install.packages)(假设你从源代码安装).

但是AFAIK你不能在相同名称下加载两次相同的包.

  • 如果需要,可以安装`lb = .libPaths(); .libPaths(c('/ custom/path',lb))` (2认同)

Joz*_*zef 13

自接受的答案以来已经过去很多年了,当然这个答案仍然有效.然而,值得一提的是同时出现的一些新选择:

管理多个版本的包

要在项目(目录)级别管理多个版本的软件包,该packrat工具可能很有用:https://rstudio.github.io/packrat/.简而言之

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

这基本上意味着您的每个项目都可以拥有自己的"私有库",与用户和系统库隔离.如果您使用的是RStudio,packrat它非常整齐且易于使用.

安装自定义包版本

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

devtools::install_version("ggplot2", version = "0.9.1")
Run Code Online (Sandbox Code Playgroud)

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

remotes::install_version("ggplot2", version = "0.9.1")
Run Code Online (Sandbox Code Playgroud)

可以找到有关该主题的更多信息:

  • 尽管我们已经完成了对刷新一个八(!!)年问题的努力的尊重,但OP确实没有问过管理依赖关系,并且确实没有关于固定版本号的安装,所以你在这里大喊大叫... (3认同)
  • @Jozef由于`devtools`被分解为更小的包,你可能想要为`remotes :: install_version()`交换`devtools :: install_version()`. (3认同)
  • 请注意,`install_version` 将覆盖任何现有安装。 (3认同)
  • 我理解问题的方式是OP试图使用一个软件包的多个版本。为此,需要做两件事:1)安装软件包的多个版本(我建议使用`devtools :: install_version`)2)安全地管理将在何处安装和加载软件包(为此我提到了`packrat`) -可以(以主观方式)更轻松地有效地执行与原始答案非常相似的操作。 (2认同)