检查R包是否已安装,然后加载库。

18
我们的R脚本在多台计算机上被多个用户使用,因此每台计算机上安装的软件包可能会有偏差。为了确保每个脚本适用于所有用户,我想定义一个函数pkgLoad,该函数将首先测试本地是否安装了软件包,然后使用抑制启动消息的库进行加载。参考检查安装软件包是否存在后再运行install.packages(),我尝试了以下方法
 pkgLoad <- function(x)
  {
    if (!require(x,character.only = TRUE))
    {
      install.packages(x,dep=TRUE, repos='http://star-www.st-andrews.ac.uk/cran/')
      if(!require(x,character.only = TRUE)) stop("Package not found")
    }
    #now load library and suppress warnings
    suppressPackageStartupMessages(library(x))
    library(x)
  }

当我尝试使用pkgLoad("ggplot2")加载ggplot2时,终端显示以下错误信息:
错误:paste("package", package, sep = ":") : 对象 'ggplot2' 未找到 > pkgLoad("ggplot2") 正在加载所需的程序包:ggplot2 错误:library(x) : 没有叫做‘x’的程序包 > pkgLoad("ggplot2") 错误:library(x) : 没有叫做‘x’的程序包
为什么x从ggplot2变成普通的x?

3
在我看来,最后两次对library的调用是多余的——如果包已经存在的话,在那个时候该包应该已经被加载了。 - Lars Kotthoff
6个回答

17

前几天我写了这个函数,我认为它会很有用...

install_load <- function (package1, ...)  {   

   # convert arguments to vector
   packages <- c(package1, ...)

   # start loop to determine if each package is installed
   for(package in packages){

       # if package is installed locally, load
       if(package %in% rownames(installed.packages()))
          do.call('library', list(package))

       # if package is not installed locally, download, then load
       else {
          install.packages(package)
          do.call("library", list(package))
       }
   } 
}

2
感谢您创建此函数。我对该函数进行了一些更改,并在GitHub上发布了它(https://github.com/iembry-USGS/install.load)。 - iembry
2
非常感谢。我的下一步将是将该软件包发布到CRAN。 - iembry
2
软件包存储库已更改为https://gitlab.com/iembry/install.load。它也位于CRAN中。我将很快对软件包进行另一个更新。 - iembry

14

我维护的CRAN pacman包可以很好地解决这个问题。使用以下标头(确保先安装pacman),然后使用p_load函数尝试加载该软件包,如果R无法加载该软件包,则会从CRAN中获取它们。

if (!require("pacman")) install.packages("pacman"); library(pacman)
p_load(qdap, ggplot2, fakePackage, dplyr, tidyr)

p_load 可以打印警告信息(被其他包屏蔽的函数)吗? - derelict

7
使用 library(x,character.only=TRUE)。另外,你不需要最后一行,因为 suppressPackageStartupMessages(library(x,character.only=TRUE)) 已经加载了包。
编辑:@LarsKotthoff 是正确的,你已经在 if 括号里面加载了该包。在那里你已经使用了 character.only=TRUE 选项,如果只是删除函数体的最后两行,一切都会好的。

3
看看这个不错的功能: 点击

2
以下内容可供使用:
check.and.install.Package<-function(package_name){
    if(!package_name%in%installed.packages()){
        install.packages(package_name)
    }
}

check.and.install.Package("RTextTools")
check.and.install.Package("e1071")

1
虽然@maloneypatr的函数运行良好,但它相当沉默且不响应包加载成功的事件。我构建了下面的函数,对用户输入进行了一些检查,并在成功安装的软件包数量上作出响应。
lubripack <- function(...,silent=FALSE){

  #check names and run 'require' function over if the given package is installed
  requirePkg<- function(pkg){if(length(setdiff(pkg,rownames(installed.packages())))==0)
                                    require(pkg, quietly = TRUE,character.only = TRUE)
                            }

  packages <- as.vector(unlist(list(...)))
  if(!is.character(packages))stop("No numeric allowed! Input must contain package names to install and load")

  if (length(setdiff(packages,rownames(installed.packages()))) > 0 )
     install.packages(setdiff(packages,rownames(installed.packages())),
                      repos = c("https://cran.revolutionanalytics.com/", "http://owi.usgs.gov/R/"))

  res<- unlist(sapply(packages, requirePkg))

  if(silent == FALSE && !is.null(res)) {cat("\nBellow Packages Successfully Installed:\n\n")
                    print(res)
                   }
}

注意 1:

如果 silent = TRUE(全大写的 "silent"),则安装和加载包时不会报告。 如果 silent = FALSE,则会报告成功安装的包。 默认值为 silent = FALSE

如何使用

lubripack(“pkg1","pkg2",.,.,.,.,"pkg")

示例1:当所有软件包都有效且模式不为静默时

lubripack(“shiny","ggvis")

或者

lubripack(“shiny","ggvis", silent = FALSE)

输出

enter image description here

示例2:当所有软件包都有效且模式为静默时

lubripack(“caret","ggvis","tm", silent = TRUE) 

输出 2

enter image description here

示例3:当无法找到包时
lubripack(“shiny","ggvis","invalidpkg", silent=FALSE) 

输出3

enter image description here


如何安装包:

运行以下代码从GitHub下载并安装包。无需拥有GitHub帐户。

library(devtools)
install_github("espanta/lubripack")

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