假设
$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
下安装新的包集合,该目录是"版本-3.4.1-等效"我目前在$HOME/my/R_lib/3.3.1
下的图书馆。
(现在,我正在寻找类似于使用Python pip
安装程序""冻结"选项的功能,基本上,生成输入,将来必须让安装程序重现当前安装。)
答案 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
允许您从这些文件中选择一些其他字段。确定包来源的兴趣领域是字段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",]
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]))
}