17

我们的 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 时,我在终端中收到以下错误消息

粘贴错误(“包”,包,sep =“:”):找不到对象'ggplot2'> pkgLoad(“ggplot2”)加载所需的包:ggplot2库(x)中的错误:没有名为'x'的包> pkgLoad("ggplot2") library(x) 中的错误:没有名为 'x' 的包</p>

为什么 x 从 ggplot2 变为普通的旧 x?

4

6 回答 6

16

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

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))
       }
   } 
}
于 2014-02-28T13:21:18.483 回答
13

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

if (!require("pacman")) install.packages("pacman"); library(pacman)
p_load(qdap, ggplot2, fakePackage, dplyr, tidyr)
于 2015-05-11T18:15:38.817 回答
7

使用library(x,character.only=TRUE). 此外,您不需要最后一行,因为 suppressPackageStartupMessages(library(x,character.only=TRUE))已经加载了包。

编辑:@LarsKotthoff 是对的,您已经在 if 括号内加载了包。在那里你已经使用了选项 character.only=TRUE 所以如果你只删除函数体的最后一行,一切都很好。

于 2013-03-01T11:27:07.347 回答
3

看看这个不错的功能: klick

于 2013-03-01T11:04:05.083 回答
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")
于 2017-09-09T13:40:36.003 回答
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 = FALSE,则报告成功安装软件包。默认值为silent = FALSE

如何使用

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

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

lubripack(“shiny","ggvis")

或者

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

输出

在此处输入图像描述

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

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

输出 2

在此处输入图像描述

示例 3:找不到包时

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

输出 3

在此处输入图像描述


如何安装包:

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

library(devtools)
install_github("espanta/lubripack")
于 2016-04-23T14:46:40.100 回答