foo <- function(x){
for( i in x ){
# require returns TRUE invisibly if it was able to load package
if( ! require( i , character.only = TRUE ) ){
# If package was not able to be loaded then re-install
install.packages( i , dependencies = TRUE )
# Load package after installing
require( i , character.only = TRUE )
}
}
}
# Then try/install packages...
foo( c("ggplot2" , "reshape2" , "data.table" ) )
5
if (!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')
# Function to Install and Load R Packages
Install_And_Load <- function(Required_Packages)
{
Remaining_Packages <- Required_Packages[!(Required_Packages %in% installed.packages()[,"Package"])];
if(length(Remaining_Packages))
{
install.packages(Remaining_Packages);
}
for(package_name in Required_Packages)
{
library(package_name,character.only=TRUE,quietly=TRUE);
}
}
# Specify the list of required packages to be installed and load
Required_Packages=c("ggplot2", "Rcpp");
# Call the Function
Install_And_Load(Required_Packages);
26 回答
是 . 如果您有包列表,请将其与
installed.packages()[,"Package"]
的输出进行比较,然后安装缺少的包 . 像这样的东西:除此以外:
如果您将代码放在一个包中并使它们成为依赖项,那么在安装包时它们将自动安装 .
Dason K.和我有 pacman 包可以做得很好 . 包中的函数
p_load
执行此操作 . 第一行是为了确保安装pacman .您只需使用
require
的返回值:我在安装后使用
library
,因为如果由于某些其他原因而无法加载安装,它将抛出异常 . 您可以使其更加强大和可重用:这种方法的缺点是你必须在引号中传递包名,而不是真正的
require
.虽然Shane的答案非常好,但对于我的一个项目,我需要自动删除输出消息,警告和安装包 . 我终于设法得到这个脚本:
使用:
这与未加引用的包名称一起使用并且非常优雅(参见GeoObserver的答案)
此解决方案将采用包名称的字符向量并尝试加载它们,或者在加载失败时安装它们 . 它依赖于
require
的返回行为来执行此操作,因为......因此,我们可以简单地看看我们是否能够加载所需的包,如果没有,请安装依赖项 . 所以给定一个你希望加载的包的字符向量...
“ggplot2”是包 . 它会检查软件包是否已安装,如果不安装软件包 . 然后它加载包,无论它采用哪个分支 .
上面的很多答案(以及这个问题的重复)都依赖于
installed.packages
这是不好的形式 . 从文档:因此,更好的方法是尝试使用
require
加载包,并在加载失败时安装(如果找不到,则返回require
FALSE
) . 我更喜欢这个实现:可以像这样使用:
这样它就可以加载所有的包,然后返回并安装所有丢失的包(如果你愿意的话,这是一个方便的地方,可以插入提示询问用户是否要安装包) . 不是为每个包单独调用
install.packages
,而是仅传递一次卸载包的整个向量 .这是相同的功能,但有一个Windows对话框,询问用户是否要安装缺少的包
这是rbundler package的目的:提供一种控制为特定项目安装的包的方法 . 现在,该软件包使用devtools功能将软件包安装到您的项目's directory. The functionality is similar to Ruby' s bundler .
如果您的项目是一个包(推荐),那么您所要做的就是加载rbundler并捆绑包 .
bundle
函数将查看包的DESCRIPTION
文件以确定要捆绑的包 .现在这些包将安装在.Rbundle目录中 .
如果您的项目不是软件包,那么您可以通过在项目的根目录中创建一个
DESCRIPTION
文件来伪造它,并使用Depends字段列出要安装的软件包(带有可选的版本信息):这里's the github repo for the project if you'对贡献感兴趣:rbundler .
当然 .
您需要将'installed packages'与'desired packages'进行比较 . 这与我对CRANberries的处理非常接近,因为我需要将'stored known packages'与'currently known packages'进行比较以确定新的和/或更新的包 .
所以做点什么
获取所有已知的包,对当前安装的包进行类似调用,并将其与给定的一组目标包进行比较 .
以下简单的功能就像一个魅力:
(不是我的,一段时间后在网上发现这个并且从那时起一直在使用它 . 不确定原始来源)
如果
require("<package>")
退出并找不到包错误,我使用以下函数来安装包 . 它将查询 - CRAN和Bioconductor存储库以查找丢失的包 .改编自Joshua Wiley的原创作品,http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html
例:
PS:
update.packages(ask = FALSE)
&biocLite(character(), ask=FALSE)
将更新系统上所有已安装的软件包 . 这可能需要很长时间,并将其视为完整的R升级,可能无法保证!您只需使用
setdiff
函数即可获取未安装的软件包,然后再安装它们 . 在下面的示例中,我们检查是否安装了 ggplot2 和 Rcpp 软件包,然后再进行安装 .在一行中,上述内容可以写成:
我已经实现了静默安装和加载所需R包的功能 . 希望可能有帮助 . 这是代码:
使用
packrat
以使共享库完全相同并且不会更改其他环境 .在优雅和最佳实践方面,我认为你从根本上讲是错误的 . 包
packrat
是为这些问题而设计的 . 它由Htley Wickham的RStudio开发 . 而不是他们必须安装依赖项并可能搞砸某人环境系统packrat
使用自己的目录并在他们的环境中安装程序的所有依赖项 .https://rstudio.github.io/packrat/
关于你的主要目标“安装他们还没有的库 . ”而不管使用“instllaed.packages()” . 以下函数掩盖了require的原始函数 . 它尝试加载并检查命名包“x”,如果没有安装,直接安装它包括依赖项;并最后正常加载它 . 您将函数名称从'require'重命名为'library'以保持完整性 . 唯一的限制是应该引用包名称 .
所以你可以加载和安装包的旧时尚方式R. require(“ggplot2”)require(“Rcpp”)
相当基本的一个 .
以为我会贡献我使用的那个:
使用lapply系列和匿名函数方法,您可以:
尝试附加所有列出的包 .
仅安装缺失(使用
||
延迟评估) .尝试再次附加步骤1中缺少的那些并在步骤2中安装 .
打印每个包的最终加载状态(
TRUE
/FALSE
) .我使用以下内容来检查是否已安装软件包以及是否更新了依赖项,然后加载软件包 .
这是我的代码:
在我的情况下,我想要一个可以从命令行运行的单行程序(实际上通过Makefile) . 这是一个安装“VGAM”和“羽毛”的例子,如果它们还没有安装:
从R内部它只会是:
除了以下解决方案之外,没有任何其他解决方案:
我把它保持在一条线上
我硬编码repos参数(以避免任何弹出窗口询问镜像使用)
我不打算定义一个在别处使用的函数
还要注意重要的
character.only=TRUE
(没有它,require会尝试加载包p
) .试试这个: