安装所有未安装的CRAN软件包?

18
下面的R命令将安装所有CRAN包:
availablePackages <- available.packages()[,1]
install.packages(availablePackages)

使用以下命令可以列出所有安装的软件包:

installedPackages <- .packages(all.available = TRUE)

我的问题是:我如何指示R安装所有未安装的CRAN软件包?


2
另一个简单的用例是将笔记本电脑设置给另一位可能离线工作的分析师。与其试图预测他们会使用哪些软件包,不如直接安装所有软件包。我们部门在配置分析师笔记本电脑时采用这种方法。 - fmark
1
setdiff(letters, letters[5:15]) - baptiste
6个回答

20

说实话,我认为这是一项艰苦的工作......它可能需要几天甚至几周的时间(取决于资源),但是这里是代码(我只是喜欢做琐碎的事情):

# get names of installed packages
packs <- installed.packages()
exc <- names(packs[,'Package'])

# get available package names
av <- names(available.packages()[,1])

# create loooong string
ins <- av[!av %in% exc]
install.packages(ins)

我仍然不明白你为什么要这样做,但是,嘿……有些事情就是注定不成的。 最让我惊奇的是,你已经回答了自己的问题!你得到了你需要的东西,现在只需要把一切放在一起… 我们是不是错过了重点?你还有其他想法吗?!?


3
“我还是不明白你为什么要这样做。” 如果您处于没有互联网访问权限的高安全环境中,那么镜像CRAN就是您需要做的事情。消息来源:我必须这样做。 - mythicalprogrammer
我知道这是一个旧帖子,但这非常有用。我每年有一两次机会打开防火墙并下载所有内容。我有大约48小时的时间窗口。然后花时间将所有环境补丁更新到相同的水平。当我有足够的带宽和存储空间时,我真的不想浪费时间尝试搭建镜像。 - Colin
1
安装所有CRAN软件包需要多少磁盘空间? - Robert Hume
@mythicalprogrammer 你成功安装了所有CRAN包吗?只是好奇需要多长时间。我是一个HPC用户,可能和你一样的原因在做这个。 - Ricardo Barros Lourenço

13

1)你为什么想要这样做?截至2012年2月,已经有超过3500个(软件包)了。

2)你看过CRAN任务视图ctv包吗?它允许你从给定的任务安装软件包。

3)你加粗的问题是一个简单的索引查询,你可以手动完成(此外,还可以参见help(sets))。

R> available <- LETTERS                  # a simple set
R> installed <- LETTERS[c(1:10, 15:26)]  # a simple subset
R> available[ ! available %in% installed ]
[1] "K" "L" "M" "N"
R> 

编辑:针对您的追问:

a) 如果一个程序包在Linux和Windows上不能通过'R CMD check'测试,则不会被上传到CRAN。所以这个任务已经完成。

b) 在您的端上获取所有依赖项也是一项工作,正如您将看到的那样。我们为cran2deb做了这件事,它位于http://debian.cran.r-project.org(这是完整的Debian软件包构建,不仅仅是安装)。我们构建了大约2150个程序包中的2050个。由于许可证问题,我们拒绝构建其中的一些程序包,由于缺少头文件或库,我们无法构建其中的一些程序包,还有一些程序包需要例如BioConductor程序包。


我想确保我的系统具有所有正确的依赖项,并通过尝试构建整个CRAN来进行测试 :-) CRAN是否包含许多损坏的软件包,我应该预计无法构建? - knorv
如果您没有在标准位置安装库,则应该预期某些库将无法构建。例如,rgdal假定已安装GDAL,并且其配置脚本可以找到它的位置。如果您将其安装在非标准位置,则需要手动指定R CMD INSTALL的正确位置。 - Sharpie
@Dirk “超过两千”的估计仍然有效,但是我,嗯,冒昧地减少了残留部分。 - Iterator
@迭代器:请不要编辑我的帖子。它已经被时间戳标记,并且数字/在给出时显然是相关的/。如果您对该值感到困扰并且必须进行编辑,请至少为您的编辑打上时间戳并签名。 - Dirk Eddelbuettel
1
@DirkEddelbuettel 抱歉。虽然更新编辑似乎是网站意图之内,但这也是我留下注释的原因,让您知道 - 以防有所影响。至于时间戳 - 这些都是编辑工具和日志记录的一部分(这都是版本控制)... - Iterator

2

输入此命令后,所有软件包将自动安装:

install.packages(available.packages()[,1])

3
这个回答相较于之前的答案有何改进之处? - Ben Bolker
1
这种方法的缺点是您的会话可能会在某个时候遇到问题并结束。使用aL3xa的方法意味着每次运行代码时,需要安装的软件包比上一次尝试运行它时少。 - Andrew Brēza

1

Better if you use:

    check.and.install.Package<-function(package_name){
        if(!package_name%in%installed.packages()){
           install.packages(package_name)
        }
     }

调用函数并检查所需的包是否已安装:
    check.and.install.Package("pkgName")

0
从我的经验来看,一次性安装所有的R包并不明智!即使您没有调用(使用library函数)所有这些包,它们只是停留在主目录中,也会拖慢您的R Studio。至少在我的情况下是这样的。

0

我已经测试过了,它可以正常工作

availablePackages=available.packages()
availablePackages<-as.vector(availablePackages[,1])
installedPackages=.packages(all.available = TRUE)
missedPackages<-setdiff(availablePackages, installedPackages)
for (i in 1:length(missedPackages))
{
pkgName <- missedPackages[i]
install.packages(pkgName)
}
print("END")

敬礼


1
需要多长时间? - OganM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接