假设
$R_LIBS_USER
设置为$HOME/my/R_lib/%V
; 和$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
安装程序的"冻结"选项的功能,这实际上产生了输入,以便将来安装程序重现当前安装.)
您可以使用此功能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 field
in installed.packages
允许您从这些文件中选择一些其他字段.确定包源的感兴趣的领域是字段Repository
,URL
和Maintainer
.以下是有关如何将它们分开的一些想法:
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)