我想在Linux上将几个R库(*)从一个驱动器移动到另一个驱动器,并且想知道一个简单的移动是否可行且安全,或者我是否应该卸载并重新安装这些软件包。我意识到库的位置是通过.libPaths()
识别的,并查看了“R安装和管理”手册以了解有关迁移库的信息,但没有看到推荐的过程。
我认为有三种选择:
remove.packages()
,然后通过install.packages(lib = "/path/to/new/location")
重新安装。mv
移动库(目录)并使用符号链接指向新位置(最终删除符号链接)mv
命令批量移动目录并在.Library.site
中更新R_HOME/etc/Rprofile.site
,如R Installation and Administration manual 选项#1是生硬的。选项#2应该有效,但看起来有点不健全。
#3是安全还是存在严重问题?我发现的问题是:目录权限以及任何包的设置存储绝对路径而不是相对路径的可能性(这似乎是不合理的和不必要的)。
关于绝对路径的存储,我发现rJava
将R_HOME
的位置存储在名为run
的文件中。这不是库本身本身的问题,但它是一个包的一个指示(以及一个好的包)保留绝对路径的私有副本。
(*)有几个库和许多包。当然,只移动库(目录),但包可能会受到影响。
更新1 /澄清:只是为了澄清:我只是迁移库,而不是更改R的版本或软件包的版本。更新R或包可以单独完成,但问题是移动库是否可行。似乎如果有必要更新或重新安装所有软件包以确保正确安装,那么这是一个类似于选项#1而不是选项#3的路径。
更新2:another SO post的答案对如何在升级时避免此问题有一些好主意。我不是升级R,但Dirk Eddelbuettel建议不在R的filetree中安装软件包是明智的。
答案 0 :(得分:28)
选项#3(将旧库复制到新库)应该有效...但是当且仅当你运行时:
update.packages(checkBuilt=TRUE)
以这种方式,需要为新版本重建的软件包将得到更新。通常情况下,新版本会增加要求(例如NAMESPACE中2.14.x中即将出现的要求)。
编辑:看到这只是在躺椅上移动......如果您要移动任何基础R装置,我将退出支持#3。它在Mac上对我有用,但我没有在R安装和管理指南或其 工作的R FAQ中看到过这样的承诺。您可以通过以下顺序完成#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安装来测试它或知道配置操作设置的任何指针如何受到影响。
答案 1 :(得分:0)
结合接受的答案和this one,我发现了一个更有效的解决方案:
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")