在 linux 下使用旧版本的 R 包的安全方法

A safe way to use older versions of an R package under linux

提问人:Andres 提问时间:11/9/2023 最后编辑:Andres 更新时间:11/16/2023 访问量:84

问:

有时我需要在 R 中运行前段时间编写的旧代码,这些代码使用的包版本与我现在使用的当前 R 版本不同。 当我不需要使用当前软件包的新功能更新和更正脚本,而只需要检查这些脚本的结果时,更安全的方法是什么?直到知道,我发现了两种可能性。

  1. 安装多个 R 版本及其关联的“旧”包,并根据需要从一个版本转移到另一个版本(如果可能的话),可能是从 rstudio 开始的。
  2. 只有一个 R 版本(假设这将是一个相对较新的版本)并在需要时使用旧包,以防这不会因将旧包与较新版本的 R 一起使用而遇到依赖项问题。

第一种选择对我来说是一场彻底的灾难,因为我试图以不同的方式安装其他版本的 R,还必须“调整”我的 debian 发行版(靶心)以接受最新的 R 版本,它变得不稳定,最后我不得不格式化我的 PC。 相关问题 这里 和 这里,但在尝试建议的解决方案之前,我想知道是否存在其他选择。 因此,我将不胜感激有关使用旧包/函数运行旧脚本的更简单、更安全的方法的任何见解。

已弃用的 R-Package 多个版本

评论

1赞 Ben Bolker 11/9/2023
例如,参见 包装和 rocker-project.orgrenv
2赞 r2evans 11/9/2023
请参阅 Posite 的 Package Manager,它提供了按日期的存储库:packagemanager.posit.co/client/#
1赞 r2evans 11/9/2023
Andres,Dirk 的建议是一个明确的路径:设置一个 lib-path(对于你想要的任何版本的 R),其中包含当时的包版本。这实际上就是这样。我认为从 now 开始有一个复杂的问题,即默认情况下它会安装今天最新的软件包,这不是您想要的起点;为此,我认为 Poset 的包管理器将允许您安装在特定日期最新的包,这允许您进行选择,尽管我认为它们可以追溯到多远是有限制的。renvrenv
1赞 Konrad Rudolph 11/9/2023
@r2evans啊,这是最新版本中的新功能,对吧?是的,这可能有效。(编辑:等等,我的意思是回复本,而不是你;但我认为“renv”现在也有这个。
1赞 r2evans 11/10/2023
是的。转到我上面提供的链接,查找“设置”按钮并单击它。它将引导你在 RStudio 中完成设置。(仅仅因为商业产品支持包管理器 (PM) 并不意味着 PM 需要商业客户端。

答:

1赞 Dirk Eddelbuettel 11/9/2023 #1

通过利用 R 使用不同库路径的能力,这非常有效。您可以通过以下方式轻松设置这些设置。.libPaths()

举个具体的例子,我碰巧喜欢使用 6.0.1 版。所以我把它放在一个我的“正常”R 安装不知道的目录中。在帮助程序脚本中(因为我也喜欢从命令行使用它),然后我这样做roxygen2

if (dir.exists("~/.R/cache/roxygen2")) {
    cat("** Using cached version 6.0.1 of roxygen2.\n")
    .libPaths("~/.R/cache")
}

## load roxygen
library(roxygen2)

在存在该目录的计算机上,它将以库路径为前缀,并且在此会话中使用较旧的 roxygen 版本。

你可以很容易地概括这一点。我们这样做是为了持续集成和其他用例。

另一个例子是例如,我使用 提供,因为它有自己的库路径(这样我就可以在编译包后跟系统路径(这样我就不必重建所有包):r-develr-devel

$ RD -q -e '.libPaths()'
> .libPaths()
[1] "/usr/local/lib/R-devel/lib/R/library" 
[2] "/usr/local/lib/R/site-library"       
> 
$ 

评论

0赞 Andres 11/10/2023
非常感谢 @Dirk-Eddelbuettel 的回复。我喜欢这个建议,并正在尝试一下。我成功地更改了 .libPaths() 的值,以便当我安装旧软件包时,例如。install.packages(“url_to_old_package”, repos = NULL, type = source),新包会转到我的新自定义目录,例如“/home/andres/R/my_new_folder”。但是我想知道当软件包依赖于其他需要安装的软件包时,是否一切都保持整洁。R o rstudio 是否知道选择这些包的哪个版本来保持所有旧包之间的兼容性?
0赞 Dirk Eddelbuettel 11/10/2023
RStudio 运行与你相同的 R 解释器,因此你需要找到一种方法来调整和重新调整 .也许在充当包装器的调用函数中。这取决于你。依赖关系以通常的方式得到解决:通过查看整体,因此它们必须位于“某个地方”,也许在您的新目录中。我主要说明了 R 已经可以做到这一点的基本方法,其他包(例如)也利用了(据我所知)。.libPaths().libPaths()renv
0赞 Andres 11/11/2023
谢谢德克。目前,您建议在不同的目录中安装旧软件包,使用 .libPaths() “播放”,甚至在 install.packages() 中指定目标文件夹,效果很好。