检查是否安装了R包然后加载库

moa*_*eep 15 r

我们的R脚本用于多台计算机上的多个用户,因此每台计算机上都安装了软件包.为了确保每个脚本都适用于所有用户,我想定义一个函数pkgLoad,它将首先测试是否在本地安装软件包,然后再使用抑制的启动消息加载库.在运行install.packages()作为指南之前使用Check for installed 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)
  }
Run Code Online (Sandbox Code Playgroud)

当我尝试使用pkgLoad("ggplot2")加载ggplot2时,我在终端中收到以下错误消息

Error in paste("package", package, sep = ":") : 
  object 'ggplot2' not found
> pkgLoad("ggplot2")
Loading required package: ggplot2
Error in library(x) : there is no package called ‘x’
> pkgLoad("ggplot2")
Error in library(x) : there is no package called ‘x’
Run Code Online (Sandbox Code Playgroud)

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

mal*_*atr 11

我前几天写了这个函数,我觉得它很有用......

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))
       }
   } 
}
Run Code Online (Sandbox Code Playgroud)

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

Tyl*_*ker 9

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

if (!require("pacman")) install.packages("pacman"); library(pacman)
p_load(qdap, ggplot2, fakePackage, dplyr, tidyr)
Run Code Online (Sandbox Code Playgroud)


Jou*_*ske 7

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

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