programing

install.packages()를 실행하기 전에 설치된 패키지를 확인합니다.

closeapi 2023. 6. 5. 23:56
반응형

install.packages()를 실행하기 전에 설치된 패키지를 확인합니다.

다른 컴퓨터의 여러 사용자와 공유하는 R 스크립트가 있습니다.라인 중 하나는 다음을 포함합니다.install.packages("xtable")지휘권

문제는 누군가 스크립트를 실행할 때마다 R이 패키지를 다시 설치하는 데 상당한 시간을 소비한다는 것입니다(실제 케이스에는 여러 패키지의 벡터가 있기 때문에 실제로는 시간이 걸립니다).

패키지가 설치되어 있는지 먼저 확인하고 실행하려면 어떻게 해야 합니까?install.packages()그렇지 않은 사람들을 위해?

시도:require("xtable")또는"xtable" %in% rownames(installed.packages())

가능한 한 간단하게 수행하려면 다음 작업을 수행합니다.

packages <- c("ggplot2", "dplyr", "Hmisc", "lme4", "arm", "lattice", "lavaan")

install.packages(setdiff(packages, rownames(installed.packages())))  

첫 번째 줄에 나열된 패키지를 코드 실행에 필요한 패키지로 대체하고 voila!

참고: 아래 Artem의 코멘트 덕분에 조건부 포장지를 제거하도록 편집되었습니다.

이 기능은 패키지를 확인하고 설치한 후 다시 로드하는 데 자주 사용했습니다.

pkgTest <- function(x)
  {
    if (!require(x,character.only = TRUE))
    {
      install.packages(x,dep=TRUE)
        if(!require(x,character.only = TRUE)) stop("Package not found")
    }
  }

다음과 같이 작동합니다.pkgTest("xtable")미러가 설정되어 있는 경우에만 작동하지만, 해당 정보를 다음 페이지에 입력할 수 있습니다.require전화가 걸려오는 전화.

다음을 사용하여 보다 가벼운 솔루션을 제안합니다.system.file.

is_inst <- function(pkg) {
    nzchar(system.file(package = pkg))
}

is_inst2 <- function(pkg) {
    pkg %in% rownames(installed.packages())
}

library(microbenchmark)
microbenchmark(is_inst("aaa"), is_inst2("aaa"))
## Unit: microseconds
##            expr      min        lq       mean    median       uq       max neval
##  is_inst("aaa")   22.284   24.6335   42.84806   34.6815   47.566   252.568   100
## is_inst2("aaa") 1099.334 1220.5510 1778.57019 1401.5095 1829.973 17653.148   100
microbenchmark(is_inst("ggplot2"), is_inst2("ggplot2"))
## Unit: microseconds
##                expr      min       lq     mean   median       uq      max neval
##  is_inst("ggplot2")  336.845  386.660  459.243  431.710  483.474  867.637   100
## is_inst2("ggplot2") 1144.613 1276.847 1507.355 1410.054 1656.557 2747.508   100

또한 CRAN 패키지 팩맨이 있습니다.p_load하나 이상의 패키지(필요한 경우에만)를 설치한 다음 로드하는 기능입니다.

requiredPackages = c('plyr','ggplot2','ggtern')
for(p in requiredPackages){
  if(!require(p,character.only = TRUE)) install.packages(p)
  library(p,character.only = TRUE)
}
# Function to check whether package is installed
  is.installed <- function(mypkg){
    is.element(mypkg, installed.packages()[,1])
  } 

  # check if package "hydroGOF" is installed
  if (!is.installed("hydroGOF")){
    install.packages("hydroGOF")
  }

찾았어요packages라이브러리를 로드하기 위해 항상 모든 스크립트에 넣는 스크립트.필요한 경우에만 모든 라이브러리 처리(다운로드, 설치 및 로드)를 수행합니다.

# Install function for packages    
packages<-function(x){
  x<-as.character(match.call()[[2]])
  if (!require(x,character.only=TRUE)){
    install.packages(pkgs=x,repos="http://cran.r-project.org")
    require(x,character.only=TRUE)
  }
}
packages(ggplot2)
packages(reshape2)
packages(plyr)
# etc etc

저는 필요한 R 패키지를 자동으로 설치하고 로딩하는 기능을 구현했습니다.희망이 도움이 될 수도 있습니다.코드는 다음과 같습니다.

# Function to Install and Load R Packages
Install_And_Load <- function(Required_Packages)
{
    Remaining_Packages <- Required_Packages[!(Required_Packages %in% installed.packages()[,"Package"])];

    if(length(Remaining_Packages)) 
    {
        install.packages(Remaining_Packages);
    }
    for(package_name in Required_Packages)
    {
        library(package_name,character.only=TRUE,quietly=TRUE);
    }
}

# Specify the list of required packages to be installed and load    
Required_Packages=c("ggplot2", "Rcpp");

# Call the Function
Install_And_Load(Required_Packages);

내가 사용한 솔루션은 사차 엡스캄프와 슈광의 입력에서 파생되었습니다.기능은 다음과 같습니다.

instalaPacotes <- function(pacote) {
  if (!pacote %in% installed.packages()) install.packages(pacote)
}

패키지 "pacote"가 이미 설치되어 있으면 아무 것도 반향하지 않고 설치되지 않으면 자동으로 작동합니다.따옴표 사이에 패키지 이름을 쓰는 것을 잊지 마세요!

또는 github, glibrary에서 대량으로 인용된 입니다.이를 위한 더 효율적이고 더 나은 방법들이 거의 확실히 있지만, 저는 오래 전에 프로그램을 짰고 기본적으로 작동합니다.

  • 사용 가능한 경우 기본 클라우드 옵션을 선택하여 repo를 선택하지 않은 경우에도 작동합니다.R의 이전 버전에 있는 경우 국가 코드를 기준으로 롤백하여 미러를 선택합니다.
  • 라이브러리를 로드하려고 합니다(이 단계는 위의 방법 중 일부를 사용하여 더 효율적으로 만들 수 있습니다).
    • 실패하면 설치를 시도합니다.
    • 설치에 실패하면 설치에 실패한 패키지를 알려줍니다.
  • 맞습니다. 패키지, 여러 패키지를 종속성과 함께 단일 경로로 로드/설치할 수 있습니다(최소한 일반적으로 여기에 버그가 있을 수 있음).

예:glibrary(xtable,sos,data.table)하지만 당신이 전화를 해도 이상할 것 같지는 않아요.glibrary("xtable","sos","data.table")대신. 합니다.밀기/끌기/포크 환영.

기능 코드:

#' Try to load a library, if that fails, install it, then load it.
#'
#' glibrary short for (get)library.
#' The primary aim of this function is to make loading packages more transparent.  Given that we know we want to load a given package, actually fetching it is a formality.  glibrary skims past this formality to install the requested package.
#'
#' @export
#' @param ... comma seperated package names
#' @param lib.loc See \code{\link{require}}
#' @param quietly See \code{\link{require}}
#' @param warn.conflicts See \code{\link{require}}
#' @param pickmirror If TRUE, glibrary allows the user to select the mirror, otherwise it auto-selects on the basis of the country code
#' @param countrycode This option is ignored and the first mirror with the substring "Cloud", e.g. the RStudio cloud, is selected.  If no mirrors with that substring are identified, glibrary compares this value to results from getCRANmirrors() to select a mirror in the specified country.
#' @return logical; TRUE if glibrary was a success, an error if a package failed to load
#' @note keep.source was an arguement to require that was deprecated in R 2.15
#' @note This warning \code{Warning in install.packages: InternetOpenUrl failed: 'The operation timed out'} indicates that the randomly selected repository is not available.  Check your internet connection.  If your internet connection is fine, set pickmirror=TRUE and manually select an operational mirror.
#' @examples
#' #glibrary(lattice,MASS) #not run to prevent needless dependency
glibrary <- function(..., lib.loc = NULL, quietly = FALSE, warn.conflicts = TRUE, pickmirror = FALSE, countrycode = "us") {
  warningHandle <- function(w) {
    if (grepl("there is no package called",w$message,fixed=TRUE)) {
      return(FALSE) #not-loadable
    } else {
      return(TRUE) #loadable
    }
  }

  character.only <- TRUE  #this value is locked to TRUE so that the function passes the character value to require and not the variable name thislib
  librarynames <- unlist(lapply(as.list(substitute(.(...)))[-1],as.character))
  #if package already loaded, remove it from librarynames before processing further
  si.res <- sessionInfo()
  cur.loaded <- c(si.res$basePkgs,names(si.res$otherPkgs)) #removed names(si.res$loadedOnly) because those are loaded, but not attached, so glibrary does need to handle them.
  librarynames <- librarynames[librarynames %!in% cur.loaded]
  success <- vector("logical", length(librarynames))
  if (length(success)==0) {return(invisible(TRUE))} #everything already loaded, end.

  alreadyInstalled <- installed.packages()[,"Package"]
  needToInstall <- !librarynames %in% alreadyInstalled

  if (any(needToInstall)) {
    if (pickmirror) {chooseCRANmirror()}
    if (getOption("repos")[["CRAN"]] == "@CRAN@") {
      #Select the first "Cloud" if available
      m <- getCRANmirrors(all = FALSE, local.only = FALSE)
      URL <- m[grepl("Cloud",m$Name),"URL"][1] #get the first repos with "cloud" in the name
      if (is.na(URL)) { #if we did not find the cloud,
        #Fall back and use the previous method
        message("\nIn repsych:glibrary:  Now randomly selecting a CRAN mirror. You may reselect your CRAN mirror with chooseCRANmirror().\n")
        #if there is no repository set pick a random one by country code
        getCRANmirrors.res <- getCRANmirrors()
        foundone <- FALSE  #have we found a CRAN mirror yet?
        #is it a valid country code?
        if (!countrycode %in% getCRANmirrors.res$CountryCode) {
          stop("In repsych::glibrary:  Invalid countrycode argument")
        }
        ticker <- 0
        while (!foundone) {
          ticker <- ticker + 1
          URL <- getCRANmirrors.res$URL[sample(grep(countrycode, getCRANmirrors.res$CountryCode), 1)]
          host.list <- strsplit(URL, "/")
          host.clean <- unlist(lapply(host.list, FUN = function(x) {return(x[3])}))
          #make sure we can actually access the package list
          if (nrow(available.packages(contrib.url(URL)))!=0) {foundone <- TRUE}        
          if (ticker > 5) {stop("In repsych::glibrary:  Unable to access valid repository.  Is the internet connection working?")}
        } #end while
      } #end else
      repos <- getOption("repos")
      repos["CRAN"] <- gsub("/$", "", URL[1L])
      options(repos = repos)
    } #done setting CRAN mirror
    #installing packages
    installResults <- sapply(librarynames[needToInstall],install.packages)
    #checking for successful install
    needToInstall <- !librarynames %in% installed.packages()[,"Package"]
    if (any(needToInstall)) {
      stop(paste("In repsych::glibrary: Could not download and/or install: ",paste(librarynames[needToInstall],collapse=", "),"... glibrary stopped.",sep=""))
    } # done reporting any failure to install
  } #done if any needed to install

  #message("In repsych::glibrary:  Attempting to load requested packages...\n")
  #success <- tryCatch(
  success <- sapply(librarynames,require, lib.loc = lib.loc, quietly = FALSE, warn.conflicts = warn.conflicts, character.only = TRUE)
  #, warning=warningHandle) #end tryCatch
  if(length(success) != length(librarynames)) {stop("A package failed to return a success in glibrary.")}


  if (all(success)) {
    #message("In repsych::glibrary:  Success!")
    return(invisible(TRUE))
  } else {
    stop(paste("\nIn repsych::glibrary, unable to load: ", paste(librarynames[!success]), 
               collapse = " "))
  }
  stop("A problem occured in glibrary") #shouldn't get this far down, all returns should be made.
}
NULL

이것을 시도해 보는 것은 어떤가?

#will install the pROC library if you don't have it
if(!is.element('pROC', installed.packages()[,1]))
  {install.packages('pROC')
}else {print("pROC library already installed")}

이거면 충분해요.만들 수 있습니다.required.packages하나 이상을 확인해야 하는 경우 벡터.

required.packages <- "data.table"
new.packages <- required.packages[!(required.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

여러분들의 반응을 보면서 저는 여기저기서 힌트를 얻어 제 것을 만들었습니다.사실 대부분의 경우와 매우 유사합니다.

## These codes are used for installing packages
# function for installing needed packages
installpkg <- function(x){
    if(x %in% rownames(installed.packages())==FALSE) {
        if(x %in% rownames(available.packages())==FALSE) {
            paste(x,"is not a valid package - please check again...")
        } else {
            install.packages(x)           
        }

    } else {
        paste(x,"package already installed...")
    }
}

# install necessary packages
required_packages  <- c("sqldf","car")
lapply(required_packages,installpkg)

이전 기능을 보고 위의 팁을 사용하여 업데이트했더니 이렇게 되었습니다.

# VERSION 1.0
assign("installP", function(pckgs){
    ins <- function(pckg, mc){
        add <- paste(c(" ", rep("-", mc+1-nchar(pckg)), " "), collapse = "");
        if( !require(pckg,character.only=TRUE) ){
            reps <- c("http://lib.stat.cmu.edu/R/CRAN","http://cran.uk.R-project.org");
            for (r in reps) try(utils::install.packages(pckg, repos=r), silent=TRUE);
            if(!require(pckg,character.only = TRUE)){   cat("Package: ",pckg,add,"not found.\n",sep="");
            }else{                                      cat("Package: ",pckg,add,"installed.\n",sep="");}
        }else{                                          cat("Package: ",pckg,add,"is loaded.\n",sep=""); } }
    invisible(suppressMessages(suppressWarnings(lapply(pckgs,ins, mc=max(nchar(pckgs)))))); cat("\n"); 
}, envir=as.environment("dg_base"))

installP(c("base","a","TFX"))
Package: base ------------------- is loaded.
Package: a ---------------------- not found.
Package: TFX -------------------- installed.

그냥 대본에서 대사를 삭제하는 게 어때요?최종 사용자에게 설치할 스마트가 없는 경우xtable필요에 따라, 당신은 더 큰 문제를 가지고 있습니다 :-(. 즉, 확인해 보세요.installed.packages()

편집: 젠장, 닌자가 1분 차이로!

인 제안:: 패키지 로드: 패키지 로드: 패키지 로드sos그러면 "XXXXX를 수행하는 기능이 있습니까?"라는 질문에 대한 답변을 매우 쉽게 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/9341635/check-for-installed-packages-before-running-install-packages

반응형