Check if R package is installed then load library

前端 未结 6 931
半阙折子戏
半阙折子戏 2020-12-15 07:49

Our R scripts are used on multiple users on multiple computers and hence there are deviations in which packages are installed on each computer. To ensure that each script wo

相关标签:
6条回答
  • 2020-12-15 08:07

    I wrote this function the other day that I thought would be useful...

    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))
           }
       } 
    }
    
    0 讨论(0)
  • 2020-12-15 08:23

    Though @maloneypatr function works fine, but it is quite silent and does not respond on success of packages loaded. I built below function that does make some checks on user entry and also respond on the number of packages being successfully installed.

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

    Note 1:

    If silent = TRUE(all capital silent), it installs and loads packages without reporting. If silent = FALSE, it reports successful installation of packages. Default value is silent = FALSE

    How to use

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

    Example 1: When all packages are valid and mode is not silent

    lubripack(“shiny","ggvis")
    

    or

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

    Output

    Example 2: When all packages are valid and mode is silent

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

    Output 2

    Example 3: When package cannot be found

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

    Output 3


    How to Install Package:

    Run below code to download the package and install it from GitHub. No need to have GitHub Account.

    library(devtools)
    install_github("espanta/lubripack")
    
    0 讨论(0)
  • 2020-12-15 08:25

    The following can be used:

    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")
    
    0 讨论(0)
  • 2020-12-15 08:26

    The CRAN pacman package that I maintain can address this nicely. Using the following header (to ensure pacman is installed first) and then the p_load function will try to load the package and then get them from CRAN if R can't load the package.

    if (!require("pacman")) install.packages("pacman"); library(pacman)
    p_load(qdap, ggplot2, fakePackage, dplyr, tidyr)
    
    0 讨论(0)
  • 2020-12-15 08:30

    Have a look at this nice function: klick

    0 讨论(0)
  • 2020-12-15 08:32

    Use library(x,character.only=TRUE). Also you don't need the last line as suppressPackageStartupMessages(library(x,character.only=TRUE)) already loads the package.

    EDIT: @LarsKotthoff is right, you already load the package inside of the if brackets. There you already use option character.only=TRUE so everything is good if you just remove last to lines of your function body.

    0 讨论(0)
提交回复
热议问题