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

kjo*_*kjo 13 r

假设

  1. 已安装的RI版本为3.3.1;
  2. 我的环境变量$R_LIBS_USER设置为$HOME/my/R_lib/%V; 和
  3. 我有一个目录,$HOME/my/R_lib/3.3.1其中包含我随时间安装的大量软件包.

现在我想将我的R版本升级到3.4.1,比方说.

我正在寻找一种方便的方法来在新目录下安装新的软件包集合,该目录$HOME/my/R_lib/3.4.1是我目前拥有的库的"version-3.4.1-equivalent" $HOME/my/R_lib/3.3.1.

(IOW,我正在寻找类似于Python pip安装程序的"冻结"选项的功能,这实际上产生了输入,以便将来安装程序重现当前安装.)

pla*_*pus 9

您可以使用此功能installed.packages.即:

installed.packages(lib.loc = "$HOME/my/R_lib/3.3.1")
Run Code Online (Sandbox Code Playgroud)

返回的对象包含许多信息(每个包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)
Run Code Online (Sandbox Code Playgroud)

要回答评论中的其他问题:

如果您的旧库包含来自CRAN以外的其他来源的软件包,您将必须根据DESCRIPTION文件的内容进行一些体操,因此将取决于软件包作者记录它的程度.
Argument fieldin installed.packages允许您从这些文件中选择一些其他字段.确定包源的感兴趣的领域是字段Repository,URLMaintainer.以下是有关如何将它们分开的一些想法:

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",]
Run Code Online (Sandbox Code Playgroud)

Bioconductor包:

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

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]))
}
Run Code Online (Sandbox Code Playgroud)

  • 对于bioconductor或GitHub包等怎么办? (3认同)