迁移 R 库

Migrating R libraries

提问人:Iterator 提问时间:8/21/2011 最后编辑:CommunityIterator 更新时间:12/27/2019 访问量:20753

问:

我想在 Linux 上将多个 R 库 (*) 从一个驱动器移动到另一个驱动器,并想知道简单的移动是否可行且安全,或者我是否应该卸载并重新安装包。我意识到库的位置是通过“R 安装和管理”手册确定的,并且已经查看了“R 安装和管理”手册以了解有关迁移库的信息,但没有看到推荐的过程。.libPaths()

我认为有三种选择:

  1. 运行所有非基本软件包,然后通过 重新安装。remove.packages()install.packages(lib = "/path/to/new/location")
  2. 移动库(目录),并使用符号链接指向新位置(并最终删除符号链接)mv
  3. 按照 R 安装和管理手册中的建议,在 Linux 中使用命令将目录批发和更新到mv.Library.siteR_HOME/etc/Rprofile.site

选项 #1 是直截了当的。选项 #2 应该有效,但似乎有点不合理。

#3 安全还是存在严重问题?我发现的问题是:目录权限以及任何包的设置存储绝对路径而不是相对路径的可能性(这似乎是不合理和不必要的)。

关于绝对路径的存储,我发现将 的位置存储在一个名为 .这本身不是库问题,但它表明一个包(并且是一个很好的包)保留了绝对路径的私有副本。rJavaR_HOMErun

(*)有几个库和许多包。当然,只有库(目录)被移动,但包可能会受到影响。


更新 1 / 澄清:澄清一下:我只是迁移库,而不是更改 R 的版本或包的版本。更新 R 或包可以单独完成,但问题是移动库是否可行。似乎如果有必要更新或重新安装所有软件包以确保正确安装,那么这是一条更类似于选项 #1 而不是选项 #3 的路径。

更新 2:另一个 SO 帖子的答案有一些关于如何在升级时避免此问题的好主意。我不是在升级 R,但 Dirk Eddelbuettel 建议不要在 R 的文件树中安装包是明智的。

安装 管理 R-FAQ

评论

1赞 Fred 8/21/2011
不确定您到底要做什么,但您可能想看看这个问题以及其中的相关问题。
0赞 Ari B. Friedman 8/21/2011
+1 了解库和包之间的区别 :-)
0赞 Iterator 8/21/2011
@gsk3:我希望我修复了所有可能的错误。我不想因为这样的术语问题而受到残酷的对待。:)
1赞 Iterator 8/22/2011
@Fred:+1 - 可移植性是一个不同的问题,但是,如果不出意外,关于可移植性和完全独立的安装的讨论使我意识到我应该保留所有的包源代码。如果我卸载并重新安装,这将使确保版本相同变得微不足道。

答:

36赞 IRTFM 8/21/2011 #1

选项 #3(将旧库复制到新库)应该可以工作......但是,当且仅当您随后运行:

update.packages(checkBuilt=TRUE)

以这种方式,需要为新版本重建的包将得到更新。通常情况下,新版本会添加要求(例如 2.14.x 中即将对 NAMESPACE 提出的要求)。

编辑:看到这只是在躺椅上移动......如果您要移动任何基本 R 安装,我将放弃认可 #3。它在 Mac 中对我有用,但我在 R 安装和管理指南或 R 常见问题解答中没有看到它应该工作的承诺。您可以通过以下顺序完成 #1(在各种条件下可能是最安全的):

# In original installation, get the non-default package list:
save.pkg.list <- installed.packages()[is.na(installed.packages()[ , "Priority"]), 1]
save(save.pkg.list, file="pkglist.Rdata")
# If you want to use remove.packages() at this point it's fine. 
# Or just delete their directories.

使用新安装的 R 版本,其中包含 .Libpaths 设置为您的首选项(甚至是相同的旧安装):

load("pkglist.Rdata")
install.packages(save.pkg.list)

如果未更改 R 可执行文件,则仅将包移动到新库可能会成功(假设您还更改了 .Libpaths),但我没有 Linux 安装来测试它,也不知道配置操作设置的任何指针会受到怎样的影响。

评论

0赞 Iterator 8/21/2011
谢谢,这很有趣。您能澄清 3 件事吗:(1) 在“需要为新版本重建”中提到的版本,指的是 R,对吗?(2) 如果 (1) 是正确的,那么如果包不需要重建(即它比当前版本的 R 旧)会发生什么?(3)当你说“如果”和“仅”时,我将其解释为“必要”和“充分”条件......你真的是这个意思吗?:)如果是这样,那么我可能会遗漏一些关于为什么会这样的东西。我不是不同意,但这个选项对我来说是新的,我还没有掌握其中的逻辑。
0赞 IRTFM 8/21/2011
(1) Yes.eg 从 R 2.13.x 到 R 2.14.x 的更改,其中 x 可以是 0、1 或 2。据我了解,简单的行为复制可能会导致新的主要版本的功能包,例如从 2.13 更改为 2.14,但绝不能保证。所以我可能太绝对了。“应该工作”意味着将对版本上的包依赖关系进行检查,如果您不执行 update.packages,则不会运行任何检查。
0赞 Iterator 8/21/2011
但是,如果我只移动目录而不升级 R,那么这会有什么好处吗?
0赞 Iterator 8/22/2011
换一种说法:如果没有互联网连接,那么这种方法似乎有问题。选项 #3 不需要互联网连接,但 #1 需要。但是,我现在意识到,如果我重新安装或大规模更新,我可能会通过保留所有源代码而受益。
0赞 Iterator 8/23/2011
这听起来像是最安全的解决方案。此外,当我保存包源时,我可以提高所有内容可复制的可能性。
1赞 Rodrigo Coelho 11/20/2019 #2

将公认的答案与这个答案相结合,我找到了一个更简单的解决方案:

lib_loc <- "C:/Users/apdev/Documents/R/win-library/3.3"
to_install <- unname(installed.packages(lib.loc = lib_loc)[, "Package"])
to_install
remove.packages(to_install, lib="C:/Users/apdev/Documents/R/win-library/3.3")
install.packages(pkgs = to_install, lib="C:/Program Files/R/R-3.6.1/library")