R 检查丢失的软件包并安装它们的优雅方式?

R 检查丢失的软件包并安装它们的优雅方式?,r,packages,r-faq,R,Packages,R Faq,这几天我似乎和合著者分享了很多代码。他们中的许多人是新手/中级R用户,没有意识到他们必须安装他们还没有的软件包 是否有一种优雅的方法来调用installed.packages(),并将其与我正在加载和安装的包(如果缺少)进行比较?是的。如果您有软件包列表,请将其与installed.packages()[,“Package”]的输出进行比较,然后安装缺少的软件包。大概是这样的: list.of.packages <- c("ggplot2", "Rcpp") new.packages &l

这几天我似乎和合著者分享了很多代码。他们中的许多人是新手/中级R用户,没有意识到他们必须安装他们还没有的软件包


是否有一种优雅的方法来调用
installed.packages()
,并将其与我正在加载和安装的包(如果缺少)进行比较?

是的。如果您有软件包列表,请将其与
installed.packages()[,“Package”]
的输出进行比较,然后安装缺少的软件包。大概是这样的:

list.of.packages <- c("ggplot2", "Rcpp")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

list.of.packages是。如果您有软件包列表,请将其与
installed.packages()[,“Package”]
的输出进行比较,然后安装缺少的软件包。大概是这样的:

list.of.packages <- c("ggplot2", "Rcpp")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
list.of.packages当然可以

您需要将“已安装的软件包”与“所需的软件包”进行比较。这与我使用的非常接近,因为我需要将“存储的已知包”与“当前已知包”进行比较,以确定新的和/或更新的包

所以做些类似的事情

AP <- available.packages(contrib.url(repos[i,"url"]))   # available t repos[i]
AP当然

您需要将“已安装的软件包”与“所需的软件包”进行比较。这与我使用的非常接近,因为我需要将“存储的已知包”与“当前已知包”进行比较,以确定新的和/或更新的包

所以做些类似的事情

AP <- available.packages(contrib.url(repos[i,"url"]))   # available t repos[i]

AP尽管Shane的回答非常好,但对于我的一个项目,我需要自动删除输出消息、警告并安装软件包。我终于获得了以下脚本:

InstalledPackage <- function(package) 
{
    available <- suppressMessages(suppressWarnings(sapply(package, require, quietly = TRUE, character.only = TRUE, warn.conflicts = FALSE)))
    missing <- package[!available]
    if (length(missing) > 0) return(FALSE)
    return(TRUE)
}

CRANChoosen <- function()
{
    return(getOption("repos")["CRAN"] != "@CRAN@")
}

UsePackage <- function(package, defaultCRANmirror = "http://cran.at.r-project.org") 
{
    if(!InstalledPackage(package))
    {
        if(!CRANChoosen())
        {       
            chooseCRANmirror()
            if(!CRANChoosen())
            {
                options(repos = c(CRAN = defaultCRANmirror))
            }
        }

        suppressMessages(suppressWarnings(install.packages(package)))
        if(!InstalledPackage(package)) return(FALSE)
    }
    return(TRUE)
}

InstalledPackage虽然Shane的回答非常好,但对于我的一个项目,我需要删除输出消息、警告并自动安装软件包。我终于获得了以下脚本:

InstalledPackage <- function(package) 
{
    available <- suppressMessages(suppressWarnings(sapply(package, require, quietly = TRUE, character.only = TRUE, warn.conflicts = FALSE)))
    missing <- package[!available]
    if (length(missing) > 0) return(FALSE)
    return(TRUE)
}

CRANChoosen <- function()
{
    return(getOption("repos")["CRAN"] != "@CRAN@")
}

UsePackage <- function(package, defaultCRANmirror = "http://cran.at.r-project.org") 
{
    if(!InstalledPackage(package))
    {
        if(!CRANChoosen())
        {       
            chooseCRANmirror()
            if(!CRANChoosen())
            {
                options(repos = c(CRAN = defaultCRANmirror))
            }
        }

        suppressMessages(suppressWarnings(install.packages(package)))
        if(!InstalledPackage(package)) return(FALSE)
    }
    return(TRUE)
}

InstalledPackage我使用以下命令检查包是否已安装以及依赖项是否已更新,然后加载包

p<-c('ggplot2','Rcpp')
install_package<-function(pack)
{if(!(pack %in% row.names(installed.packages())))
{
  update.packages(ask=F)
  install.packages(pack,dependencies=T)
}
 require(pack,character.only=TRUE)
}
for(pack in p) {install_package(pack)}

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

p我使用以下命令检查包是否已安装以及依赖项是否已更新,然后加载包

p<-c('ggplot2','Rcpp')
install_package<-function(pack)
{if(!(pack %in% row.names(installed.packages())))
{
  update.packages(ask=F)
  install.packages(pack,dependencies=T)
}
 require(pack,character.only=TRUE)
}
for(pack in p) {install_package(pack)}

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

p的目的是:提供一种方法来控制为特定项目安装的软件包。现在,该软件包与devtools功能一起工作,将软件包安装到项目目录中。其功能类似于Ruby

如果您的项目是一个包(推荐),那么您所要做的就是加载rbundler并捆绑包。
bundle
函数将查看包的
说明
文件,以确定要捆绑哪些包

library(rbundler)
bundle('.', repos="http://cran.us.r-project.org")
现在,这些包将安装在.Rbundle目录中

如果您的项目不是软件包,那么您可以通过在项目的根目录中创建一个
DESCRIPTION
文件来伪造它,其中包含一个Depends字段,该字段列出了您要安装的软件包(带有可选的版本信息):


如果您对贡献感兴趣,这里是项目的github repo:。

这是:的目的:提供一种方法来控制为特定项目安装的包。现在,该软件包与devtools功能一起工作,将软件包安装到项目目录中。其功能类似于Ruby

如果您的项目是一个包(推荐),那么您所要做的就是加载rbundler并捆绑包。
bundle
函数将查看包的
说明
文件,以确定要捆绑哪些包

library(rbundler)
bundle('.', repos="http://cran.us.r-project.org")
现在,这些包将安装在.Rbundle目录中

如果您的项目不是软件包,那么您可以通过在项目的根目录中创建一个
DESCRIPTION
文件来伪造它,其中包含一个Depends字段,该字段列出了您要安装的软件包(带有可选的版本信息):


如果您有兴趣参与,下面是项目的github repo:。

此解决方案将获取程序包名称的字符向量,并尝试加载它们,或者在加载失败时安装它们。它依赖于
require
的返回行为来执行此操作,因为

require
返回(不可见)一个逻辑值,指示所需的包是否可用

因此,我们可以简单地查看是否能够加载所需的包,如果不能,则使用依赖项安装它。因此,给定您希望加载的包的字符向量

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" ) )

foo此解决方案将获取程序包名称的字符向量并尝试加载它们,或者在加载失败时安装它们。它依赖于
require
的返回行为来执行此操作,因为

require
返回(不可见)一个逻辑值,指示所需的包是否可用

因此,我们可以简单地查看是否能够加载所需的包,如果不能,则使用依赖项安装它。因此,给定您希望加载的包的字符向量

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" ) )

foo您可以使用
require
的返回值:

if(!require(somepackage)){
    install.packages("somepackage")
    library(somepackage)
}
我在安装后使用
library
,因为如果安装不成功或由于其他原因无法加载包,它将引发异常。您可以使其更加健壮和可重用:

dynamic_require <- function(package){
  if(eval(parse(text=paste("require(",package,")")))) return True

  install.packages(package)
  return eval(parse(text=paste("require(",package,")")))
}

dynamic\u require您只需使用
require的返回值即可:

if(!require(somepackage)){
    install.packages("somepackage")
    library(somepackage)
}
我在安装后使用
library
,因为如果安装不成功或由于其他原因无法加载包,它将引发异常。您可以使其更加健壮和可重用:

dynamic_require <- function(package){
  if(eval(parse(text=paste("require(",package,")")))) return True

  install.packages(package)
  return eval(parse(text=paste("require(",package,")")))
}

dynamic\u requireDason K。我有pacman软件包,可以很好地完成这项工作。软件包中的函数
p\u load
会执行此操作。第一行只是确保安装了pacman

if (!require("pacman")) install.packages("pacman")
pacman::p_load(package1, package2, package_n)

Dason K.和我的《吃豆人》(pacman)软件包可以很好地做到这一点。软件包中的函数
p\u load
会执行此操作。第一行只是确保安装了pacman

if (!require("pacman")) install.packages("pacman")
pacman::p_load(package1, package2, package_n)
关于你的mai
pkgs = c("pacman","data.table")
if(length(new.pkgs <- setdiff(pkgs, rownames(installed.packages())))) install.packages(new.pkgs)
testin <- function(package){if (!package %in% installed.packages())    
install.packages(package)}
testin("packagename")
unavailable <- setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages()))
install.packages(unavailable)
install.packages(setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages())))
library <- function(x){
  x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
  install.packages(x)
  base::library(x,character.only=TRUE)
}}
if (!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')
using<-function(...) {
    libs<-unlist(list(...))
    req<-unlist(lapply(libs,require,character.only=TRUE))
    need<-libs[req==FALSE]
    if(length(need)>0){ 
        install.packages(need)
        lapply(need,require,character.only=TRUE)
    }
}
using("RCurl","ggplot2","jsonlite","magrittr")
using<-function(...) {
    libs<-unlist(list(...))
    req<-unlist(lapply(libs,require,character.only=TRUE))
    need<-libs[req==FALSE]
    n<-length(need)
    if(n>0){
        libsmsg<-if(n>2) paste(paste(need[1:(n-1)],collapse=", "),",",sep="") else need[1]
        print(libsmsg)
        if(n>1){
            libsmsg<-paste(libsmsg," and ", need[n],sep="")
        }
        libsmsg<-paste("The following packages could not be found: ",libsmsg,"\n\r\n\rInstall missing packages?",collapse="")
        if(winDialog(type = c("yesno"), libsmsg)=="YES"){       
            install.packages(need)
            lapply(need,require,character.only=TRUE)
        }
    }
}
source("https://bioconductor.org/biocLite.R")
if (!require("ggsci")) biocLite("ggsci")
R -e 'for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")'
for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")
req <- substitute(require(x, character.only = TRUE))
lbs <- c("plyr", "psych", "tm")
sapply(lbs, function(x) eval(req) || {install.packages(x); eval(req)})

plyr psych    tm 
TRUE  TRUE  TRUE 
  packages_installed <- function(pkg_list){
        pkgs <- unlist(pkg_list)
        req <- unlist(lapply(pkgs, require, character.only = TRUE))
        not_installed <- pkgs[req == FALSE]
        lapply(not_installed, install.packages, 
               repos = "http://cran.r-project.org")# add lib.loc if needed
        lapply(pkgs, library, character.only = TRUE)
}
c("ggplot2","ggsci", "hrbrthemes", "gghighlight", "dplyr") %>%  # What will you need to load for this script?
  (function (x) ifelse(t =!(x %in% installed.packages()), 
    install.packages(x[t]),
    lapply(x, require))) 
# a package that exists
find.package('data.table', quiet=TRUE)
# [1] "/Library/Frameworks/R.framework/Versions/4.0/Resources/library/data.table"

# a package that does not
find.package('InstantaneousWorldPeace', quiet=TRUE)
# character(0)