如何在$ R_LIBS_USER下快速复制/更新本地库?

时间:2018-02-02 18:15:33

标签: r

假设

  1. 我安装的R版本是3.3.1;
  2. 我的环境变量$R_LIBS_USER设置为$HOME/my/R_lib/%V;和
  3. 我有一个目录$HOME/my/R_lib/3.3.1,其中包含我已经安装的大量软件包。
  4. 现在我想将我的R版本升级到3.4.1,比如说。

    我正在寻找一种方便的方法来在新目录$HOME/my/R_lib/3.4.1下安装新的包集合,该目录是"版本-3.4.1-等效"我目前在$HOME/my/R_lib/3.3.1下的图书馆。

    (现在,我正在寻找类似于使用Python pip安装程序""冻结"选项的功能,基本上,生成输入,将来必须让安装程序重现当前安装。)

1 个答案:

答案 0 :(得分:9)

您可以使用函数installed.packages来实现此目的。即:

installed.packages(lib.loc = "$HOME/my/R_lib/3.3.1")

返回的对象包含许多信息(每个包DESCRIPTION文件中的大多数字段),但包的名称位于第一列。所以类似下面的内容应该可以解决问题:

inst <- installed.packages(lib.loc = "$HOME/my/R_lib/3.3.1")
install.packages(inst[,1], lib="$HOME/my/R_lib/3.4.1", dependencies=FALSE)

回答评论中的其他问题:

如果你的旧图书馆包含来自CRAN以外的其他来源的软件包,你必须根据DESCRIPTION文件的内容做一些体操,因此将取决于软件包作者记录它的程度。 /> field中的参数installed.packages允许您从这些文件中选择一些其他字段。确定包来源的兴趣领域是字段RepositoryURLMaintainer。以下是关于如何将它们分开的一些想法:

CRAN与非CRAN:

inst <- installed.packages(lib.loc = "$HOME/my/R_lib/3.3.1", 
                           fields=c("URL","Repository","Maintainer"))
inst <- as.data.frame(inst, row.names=NA, stringsAsFactors=FALSE)
cran <- inst[inst$Repository%in%"CRAN",]
non_cran <- inst[!inst$Repository%in%"CRAN" & !inst$Priority%in%"base",]

Bioconductor包:

bioc <- inst[grepl("Bioconductor",inst$Maintainer),]
source("https://bioconductor.org/biocLite.R")
biocLite(pkgs=bioc$Packages)

Github包:

git <- non_cran[grepl("github", non_cran$URL),]
install.packages("devtools")
library(devtools)
for(i in seq(nrow(git))){
    install_github(repo=gsub("http://github.com/","",git$URL[i]))
}