为了能够比较包的两个版本,我需要能够选择我加载的包的版本。 R的软件包系统默认设置为覆盖现有软件包,因此您始终拥有最新版本。如何覆盖此行为?
到目前为止,我的想法是:
我可以获取包源,编辑描述以提供不同的名称,并实际构建两个不同的包。我宁愿能够直接使用二进制文件,因为它不那么麻烦。
我不一定需要同时加载两个版本的软件包(只是同时安装在某个地方)。我可能会用Sys.getenv('R_HOME')
来改变R安装包的位置,然后.libpaths()
来改变R寻找它们的地方。这看起来很糟糕,所以有没有人有更好的想法?
答案 0 :(得分:55)
您可以有选择地更改库路径。为了完全透明,请将两者都放在通常的路径之外,然后执行
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你不能以相同的名称加载两次相同的包。
答案 1 :(得分:9)
自从接受答案以来已经过去了很多年,当然答案仍然有效。但是,值得一提的是,在此期间出现了一些新的选择:
管理软件包的多个版本
要在项目(目录)级别上管理软件包的多个版本,packrat
工具可能会有用:https://rstudio.github.io/packrat/。简而言之
Packrat通过将软件包依赖关系存储在其中来增强项目目录,而不是依靠在所有其他R会话之间共享的个人R库。
这基本上意味着您的每个项目都可以有自己的“私有库”,与用户库和系统库隔离。如果您使用的是RStudio,则packrat
集成得非常好并且易于使用。
安装自定义软件包版本
就安装软件包的自定义版本而言,有很多方法,也许最方便的方法是使用devtools软件包,例如:
devtools::install_version("ggplot2", version = "0.9.1")
或者,正如Richie所建议的那样,现在有一个名为remotes的更轻量级的软件包,它是将devtools分解为更小的软件包的结果,其用法非常相似:
remotes::install_version("ggplot2", version = "0.9.1")
可以找到有关该主题的更多信息:
答案 2 :(得分:0)
我与 R 一起工作了很长时间,直到今天我才想到这个。这个想法来自这样一个事实,即我开始涉足 Python 并且我必须做的第一步是管理他们(pythonistas)所谓的“虚拟环境”。他们甚至为这项看似重要的任务提供了专用工具。我让自己更多地了解了这方面以及他们为何如此认真对待它。我终于意识到这是管理具有冲突依赖项的不同项目的一种简洁而重要的方法。我想知道为什么 R 没有这个功能,并发现实际上 R 中存在“环境”的概念,但没有像 Python 那样介绍给新手。因此,您需要查看有关此的文档,它将解决您的问题。 抱歉我胡说八道,但我认为这会有所帮助。