迁移R库

迁移R库,r,installation,administration,r-faq,R,Installation,Administration,R Faq,我想在Linux上将几个R库(*)从一个驱动器移动到另一个驱动器,并且想知道一个简单的移动是否可行和安全,或者我是否应该卸载并重新安装这些包。我意识到库的位置是通过.libPaths()确定的,我已经阅读了“R安装和管理”手册以了解库的迁移,但没有看到推荐的过程 我认为有三种选择: 对所有非基本软件包运行remove.packages(),然后通过install.packages(lib=“/path/to/new/location”)重新安装 使用mv移动库(目录),并使用符号链接指向新位置(

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

我认为有三种选择:

  • 对所有非基本软件包运行
    remove.packages()
    ,然后通过
    install.packages(lib=“/path/to/new/location”)
    重新安装
  • 使用
    mv
    移动库(目录),并使用符号链接指向新位置(并最终删除符号链接)
  • 在Linux中使用
    mv
    命令在
    R\u HOME/etc/Rprofile.site
    中批量移动目录并更新
    .Library.site
    ,如
  • 选项1是直截了当的。选项2应该可行,但似乎有点不合理

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

    关于绝对路径的存储,我发现
    rJava
    R\u HOME
    的位置存储在一个名为
    run
    的文件中。这本身不是一个库问题,但它是一个包(在这方面是一个好的包)保持绝对路径的私有副本的指示

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


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

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

    选项3(将旧库复制到新库)应该可以。。。但当且仅当您运行时:

    update.packages(checkBuilt=TRUE)
    
    以这种方式,需要为新版本重建的包将得到更新。通常情况下,新版本会添加需求(例如2.14.x中即将出现的名称空间需求)

    编辑:看到这只是在躺椅上走动。。。。如果你要移动任何base 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可执行文件没有更改,只将包移动到新库可能会成功(假设您也更改了.libpath),但我没有Linux安装来测试它,也不知道配置操作设置的任何指针会受到什么影响。

    结合已接受的答案,我发现了一个更简单的解决方案:

    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")
    

    lib_loc不确定您到底想做什么,但您可能想看看这个问题及其相关内容。+1了解库和包之间的区别:-)@gsk3:我希望我修复了所有可能的此类错误。我不想因为这样一个术语问题而被粗暴对待。:)@Fred:+1-可移植性是一个不同的问题,但是,如果没有其他问题的话,关于可移植性的讨论&一个完全独立的安装让我意识到我应该保留所有的包源。如果我卸载并重新安装,那么确保版本相同就很简单了。谢谢,这很有趣。你能澄清三件事吗:(1)在“新版本需要重建”中提到版本,这是指R,对吗?(2) 如果(1)是正确的,那么如果包不需要重建(即,它比当前版本的R旧),会发生什么情况?(3) 当你说如果&仅当,我解释这意味着这是一个必要和充分条件。。。你真的是这个意思吗?:)如果是这样的话,那么我可能遗漏了一些原因。我并不反对,但这个选项对我来说是新的,我还不明白其中的逻辑。(1)是的,例如从R2.13.x更改为R2.14.x,其中x可以是0、1或2。据我所知,简单的行为复制可能会导致一个新的主要版本的功能包,例如从2.13更改为2.14,但这绝不能保证。所以我可能太直截了当了。“应该工作”意味着将检查包对版本的依赖性,如果不执行update.packages,则不会运行任何检查。然而,如果我只是移动目录而不是升级R,那么这会有任何好处吗?换言之,如果没有internet连接,那么这个方法似乎有问题。选项3不需要互联网连接,但选项1需要。然而,我现在意识到,如果我重新安装或大规模更新,我可能会从保留所有源代码中获益。这听起来是最安全的解决方案。此外,当我保存包源时,我可以提高所有内容都可复制的可能性。
    
    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")