누락 된 패키지를 확인하고 설치하는 우아한 방법?


336

요즘에는 공동 저자와 많은 코드를 공유하고있는 것 같습니다. 그들 중 다수는 초보 / 중급 R 사용자이며 아직 가지고 있지 않은 패키지를 설치해야한다는 것을 인식하지 못합니다.

전화하는 우아한 방법이 installed.packages()있습니까, 누락 된 경우로드하고 설치하는 것과 비교할 수 있습니까?


1
@krlmlr 수락 된 답변은 구식이며 수정이 필요한 것은 무엇입니까? 아래에서 (몇 가지 빠른 테스트를 위해) 작동합니다 R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit).
브라이언 딕스

1
@BrianDiggs :이 문제를 해결하기 위해 최소한 3 개의 패키지가 나타 났으며 아래에서 하나만 참조됩니다. 더 많은 것이 있습니까? 그것이 바로 질문입니다.
krlmlr

2
@krlmlr 패키지를 사용하여 다른 패키지에 필요한 패키지가 있는지 확인하는 데 약간의 아이러니 한 닭과 계란 문제가있는 것 같습니다. 그러나 그들에 대해 아는 누군가가 답을 쓰도록하는 것은 확실히 가치가 있습니다.
Brian Diggs

2
@BrianDiggs :이 설치 확인 패키지를 부트 스트랩하는 것은 필요한 성가신 일이지만 작은 것입니다. 물론, 기능은 base... ;-)에
도달

답변:


304

예. 패키지 목록이 있으면 출력 installed.packages()[,"Package"]과 비교 하여 누락 된 패키지를 설치하십시오. 이 같은:

list.of.packages <- c("ggplot2", "Rcpp")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

그렇지 않으면:

코드를 패키지에 넣고 의존성을 만들면 패키지를 설치할 때 자동으로 설치됩니다.


11
적절한 구문은 다음과 같습니다. if(length(new.packages)>0) {install.packages(new.packages)}

5
if 조건 내에서 "> 0"이 "암시 적"이므로 @psql, Shine이 맞습니다. 이것을 확인하기 위해 이것을 실행하십시오 :new.packages <- c(1,2) length(new.packages) if(length(new.packages)){print("hello!")}else{print("oh no!")}
Andrea Cirillo

7
installed.packages의 문서는 다음과 같이 설명합니다. "수 많은 패키지가 설치 될 때 속도가 느릴 수 있으므로 명명 된 패키지가 설치되어 있는지 (system.file 또는 find.package 사용) 알아 내지 마십시오."
Thomas Materna

2
Thomas와 동의하면 require확인 하는 대신 성능이 향상됩니다.installed.packages
Matthew

1
packrat이것을 위해 만들어졌습니다. 재현 가능한 패키지 관리 시스템입니다. 이 방법은 잘못된 길로 가고 있으며 다른 사람의 환경을 어지럽히고 재현 할 수 없습니다. Packrat에는 공유 라이브러리를위한 자체 폴더 및 환경이 있습니다. rstudio.github.io/packrat
mtelesha

231

Dason K.와 저는 이것을 훌륭하게 수행 할 수 있는 팩맨 패키지를 가지고 있습니다. p_load패키지 의 기능 이이를 수행합니다. 첫 번째 줄은 pacman이 설치되었는지 확인하는 것입니다.

if (!require("pacman")) install.packages("pacman")
pacman::p_load(package1, package2, package_n)

1
패키지 상태는 어떻습니까? C-RAN에서 볼 수 없습니다.
MERose


6
지금 설치했으며 훌륭하게 작동합니다. 베이스의 일부가되어야합니다!
AndyF

3
이것이 더 나은 유일한 방법 /은 github에서 자동으로 확인하고 설치하면로드하는 것입니다.
airstrike 2016 년

4
@NealBarsch if (!require("pacman")) install.packages("pacman")pacman에 함수가 있다는 것을 의미 p_boot()한다면 자동 으로이 줄을 표시하고 클립 보드에 복사합니다.
Tyler Rinker

72

반환 값은 require다음 과 같습니다.

if(!require(somepackage)){
    install.packages("somepackage")
    library(somepackage)
}

library설치에 실패했거나 다른 이유로 패키지를로드 할 수없는 경우 예외가 발생하기 때문에 설치 후에 사용 합니다. 이를보다 강력하고 재사용 가능하게 만듭니다.

dynamic_require <- function(package){
  if(eval(parse(text=paste("require(",package,")")))) return True

  install.packages(package)
  return eval(parse(text=paste("require(",package,")")))
}

이 방법의 단점은 패키지 이름을 따옴표로 묶어야한다는 것 require입니다. 실제로는하지 않습니다 .


4
character.only = TRUEin 을 사용하여 인생을 많이 단순화 할 수는 require있지만 대답을 내 것과 구별 할 수있는 것은 없다고 생각합니다.
Simon O'Hanlon

이것은 멋지지만 적어도 나에게는 효과가없는 것 같습니다. 이것의 강력한 버전을 시도했을 때, R이 어떤 이유로 "return True"와 "return eval"을 처리하는 방법을 모르기 때문에 두 가지 오류 메시지가 나타납니다. 따라서 실제로 라이브러리에 패키지가 있으면 패키지를로드하고 그렇지 않으면 패키지를 설치 (및 나중에로드)하는 이와 같은 기능을 정말로 원합니다. 이상적으로는 이것을 패키지를로드하는 기본값으로 사용합니다. 최소한 그렇게하는 것이 합리적이고 시간을 절약 할 수있을 것 같습니다.
Fabian Habersack

23
if (!require('ggplot2')) install.packages('ggplot2'); library('ggplot2')

"ggplot2"는 패키지입니다. 패키지가 설치되어 있지 않은지 확인합니다. 그런 다음 어떤 브랜치에 관계없이 패키지를로드합니다.


21

이 솔루션은 패키지 이름의 문자형 벡터를 가져 와서로드하거나로드에 실패하면 설치합니다. 이 require작업을 수행 하는 반환 동작에 의존합니다 .

require 필요한 패키지가 사용 가능한지 여부를 나타내는 논리를 (보이지 않게) 반환합니다.

따라서 필요한 패키지를로드 할 수 있는지 여부를 확인할 수 있고, 그렇지 않은 경우 종속성과 함께 설치하십시오. 따라서로드하려는 패키지의 문자 벡터가 주어지면 ...

foo <- function(x){
  for( i in x ){
    #  require returns TRUE invisibly if it was able to load package
    if( ! require( i , character.only = TRUE ) ){
      #  If package was not able to be loaded then re-install
      install.packages( i , dependencies = TRUE )
      #  Load package after installing
      require( i , character.only = TRUE )
    }
  }
}

#  Then try/install packages...
foo( c("ggplot2" , "reshape2" , "data.table" ) )

require설치 후 다시 전화하고 싶지 않습니까?
krlmlr

@krlmlr Nope, if진술을 평가하려면 먼저 평가해야합니다 require. 부작용은 가능한 경우 패키지를로드하는 것입니다!
Simon O'Hanlon

1
SimonO101 : krlmlr은 if 문에서를 호출 한 후 install.packages실제로 해당 패키지를로드하지 않으므로 if 문에서 의미한다고 생각 합니다. 그러나 (@krlmlr에) 나는이 코드 조각이 한 번만 호출 될 것이라고 생각한다. 패키지가 필요할 때마다 이것을 쓰지 않을 것입니다. 대신 사전에 한 번 실행 한 다음 require필요에 따라 평소에 전화하십시오 .
Aaron은 Stack Overflow를

@Aaron 아 예 좋아, 나는 당신이 무슨 뜻인지 알았고, 네 해석이 정확합니다. 설치 후 로딩에 대해 좀 더 명확하게하기 위해 약간 편집 할 것입니다.
Simon O'Hanlon

1
어떤 이유로 든 패키지를 여전히 연결할 수없는 경우 시끄럽게 실패하도록 두 번째 require전화를하는 것이 낫지 library않습니까?
kabdulla

18

위의 많은 답변 (그리고이 질문의 사본에 대한)은 installed.packages어느 것이 나쁜 형식인지에 의존 합니다. 설명서에서 :

수천 개의 패키지가 설치 될 때 속도가 느릴 수 있으므로 이름 지정된 패키지가 설치되어 있는지 (system.file 또는 find.package 사용) 확인하거나 패키지가 사용 가능한지 (전화 요구 및 반환 값) 또는 적은 수의 패키지에 대한 세부 정보 찾기 (packageDescription 사용) 설치된 패키지 당 여러 파일을 읽어야합니다. Windows 및 일부 네트워크 마운트 파일 시스템에서는 속도가 느립니다.

따라서 더 나은 방법은 requireand를 사용하여 패키지를로드하고 로드에 실패하면 설치하는 require것입니다 ( FALSE찾을 수 없으면 반환 ). 나는이 구현을 선호한다 :

using<-function(...) {
    libs<-unlist(list(...))
    req<-unlist(lapply(libs,require,character.only=TRUE))
    need<-libs[req==FALSE]
    if(length(need)>0){ 
        install.packages(need)
        lapply(need,require,character.only=TRUE)
    }
}

다음과 같이 사용할 수 있습니다.

using("RCurl","ggplot2","jsonlite","magrittr")

이렇게하면 모든 패키지를로드 한 다음 되돌아 가서 누락 된 모든 패키지를 설치합니다 (원하는 경우 사용자가 패키지를 설치할 것인지 묻는 메시지를 삽입하는 편리한 장소입니다). 전화하는 대신install.packages각 패키지에 대해 별도로 제거 된 패키지의 전체 벡터를 한 번만 전달합니다.

동일한 기능이지만 사용자가 누락 된 패키지를 설치할 것인지 묻는 Windows 대화 상자가 있습니다.

using<-function(...) {
    libs<-unlist(list(...))
    req<-unlist(lapply(libs,require,character.only=TRUE))
    need<-libs[req==FALSE]
    n<-length(need)
    if(n>0){
        libsmsg<-if(n>2) paste(paste(need[1:(n-1)],collapse=", "),",",sep="") else need[1]
        print(libsmsg)
        if(n>1){
            libsmsg<-paste(libsmsg," and ", need[n],sep="")
        }
        libsmsg<-paste("The following packages could not be found: ",libsmsg,"\n\r\n\rInstall missing packages?",collapse="")
        if(winDialog(type = c("yesno"), libsmsg)=="YES"){       
            install.packages(need)
            lapply(need,require,character.only=TRUE)
        }
    }
}

이것은 허용되는 것보다 훨씬 좋은 꽤 우아한 방법입니다. 개인 도서관에 포함시킬 것입니다. 감사.
Bing

15

Shane의 대답은 정말 좋지만 프로젝트 중 하나에 대해 출력 메시지, 경고를 제거하고 패키지를 자동으로 설치해야했습니다 . 마침내이 스크립트를 얻었습니다.

InstalledPackage <- function(package) 
{
    available <- suppressMessages(suppressWarnings(sapply(package, require, quietly = TRUE, character.only = TRUE, warn.conflicts = FALSE)))
    missing <- package[!available]
    if (length(missing) > 0) return(FALSE)
    return(TRUE)
}

CRANChoosen <- function()
{
    return(getOption("repos")["CRAN"] != "@CRAN@")
}

UsePackage <- function(package, defaultCRANmirror = "http://cran.at.r-project.org") 
{
    if(!InstalledPackage(package))
    {
        if(!CRANChoosen())
        {       
            chooseCRANmirror()
            if(!CRANChoosen())
            {
                options(repos = c(CRAN = defaultCRANmirror))
            }
        }

        suppressMessages(suppressWarnings(install.packages(package)))
        if(!InstalledPackage(package)) return(FALSE)
    }
    return(TRUE)
}

사용하다:

libraries <- c("ReadImages", "ggplot2")
for(library in libraries) 
{ 
    if(!UsePackage(library))
    {
        stop("Error!", library)
    }
}

9
# List of packages for session
.packages = c("ggplot2", "plyr", "rms")

# Install CRAN packages (if not already installed)
.inst <- .packages %in% installed.packages()
if(length(.packages[!.inst]) > 0) install.packages(.packages[!.inst])

# Load packages into session 
lapply(.packages, require, character.only=TRUE)

6

이것은 rbundler 패키지 의 목적입니다 . 특정 프로젝트에 설치된 패키지를 제어하는 ​​방법을 제공하는 것입니다. 현재 패키지는 devtools 기능과 함께 작동하여 프로젝트의 디렉토리에 패키지를 설치합니다. 이 기능은 Ruby의 bundler 과 유사합니다 .

프로젝트가 패키지 (권장) 인 경우 리 번 들러를로드하고 패키지를 번들하기 만하면됩니다. 이 bundle함수는 패키지 DESCRIPTION파일을 보고 번들로 묶을 패키지를 결정합니다.

library(rbundler)
bundle('.', repos="http://cran.us.r-project.org")

이제 패키지는 .Rbundle 디렉토리에 설치됩니다.

프로젝트가 패키지가 아닌 경우 DESCRIPTION설치하려는 패키지를 나열하는 Depends 필드 (옵션 버전 정보 포함)를 사용하여 프로젝트의 루트 디렉토리에 파일 을 작성하여 위조 할 수 있습니다 .

Depends: ggplot2 (>= 0.9.2), arm, glmnet

rbundler에 관심이 있다면 프로젝트의 github 저장소가 있습니다 .


5

확실한.

'설치된 패키지'와 '원하는 패키지'를 비교해야합니다. 그것은 내가 크랜베리 로하는 일에 매우 가깝습니다.'저장된 알려진 패키지'와 '현재 알려진 패키지'를 비교하여 새 패키지 및 / 또는 업데이트 된 패키지를 결정해야하므로 로 합니다.

그래서 같은 일을

AP <- available.packages(contrib.url(repos[i,"url"]))   # available t repos[i]

알려진 모든 패키지를 가져 오려면 현재 설치된 패키지를 동시에 호출하고 지정된 대상 패키지 세트와 비교하십시오.


5

사용하다 packrat공유 라이브러리가 정확히 동일하고 다른 환경을 변경하지 않도록 .

우아함과 모범 사례 측면에서 근본적으로 잘못된 방향으로 가고 있다고 생각합니다. 패키지 packrat는 이러한 문제를 위해 설계되었습니다. 그것은 Hadley Wickham에 의해 RStudio에 의해 개발되었습니다. 그것들은 의존성을 설치하고 누군가의 환경 시스템을 망칠 수있는 대신 packrat자체 디렉토리를 사용하고 거기에 프로그램의 모든 의존성을 설치하고 누군가의 환경을 건드리지 않습니다.

Packrat는 R의 종속성 관리 시스템입니다.

R 패키지 종속성은 실망 스러울 수 있습니다. 다른 사람의 코드를 작동시키기 위해 어떤 R 패키지를 설치해야하는지 파악하기 위해 시행 착오를 겪은 적이 있습니까? ? 프로젝트 중 하나에서 코드가 작동하도록 패키지를 업데이트 한 적이 있습니까? 업데이트 된 패키지로 인해 다른 프로젝트의 코드가 작동을 멈추는 것만 찾으셨습니까?

이러한 문제를 해결하기 위해 packrat을 구축했습니다. packrat를 사용하여 R 프로젝트를 더 많이 만드십시오.

  • 격리 됨 : 한 프로젝트에 새 패키지 나 업데이트 된 패키지를 설치해도 다른 프로젝트가 중단되지 않으며 그 반대도 마찬가지입니다. packrat가 각 프로젝트에 자체 개인 패키지 라이브러리를 제공하기 때문입니다.
  • 이식성 : 한 플랫폼에서 다른 플랫폼으로 프로젝트를 쉽게 전송할 수 있습니다. Packrat를 사용하면 프로젝트가 의존하는 패키지를 쉽게 설치할 수 있습니다.
  • 재현성 : Packrat은 사용자가 사용하는 정확한 패키지 버전을 기록하고 정확한 버전이 어디에서나 설치되도록합니다.

https://rstudio.github.io/packrat/


4

다음과 같은 간단한 기능이 매력처럼 작동합니다.

  usePackage<-function(p){
      # load a package if installed, else load after installation.
      # Args:
      #   p: package name in quotes

      if (!is.element(p, installed.packages()[,1])){
        print(paste('Package:',p,'Not found, Installing Now...'))
        install.packages(p, dep = TRUE)}
      print(paste('Loading Package :',p))
      require(p, character.only = TRUE)  
    }

(내 것이 아니라 웹에서이를 발견하고 그 이후로 사용 해 왔습니다. 원본 출처를 모름)


4

다음 기능을 사용하여 패키지를 설치하십시오. require("<package>")패키지를 찾을 수 없음 오류로 종료 . 패키지 누락에 대해 CRAN 및 Bioconductor 리포지토리를 모두 쿼리합니다.

Joshua Wiley ( http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html) 의 원작에서 발췌

install.packages.auto <- function(x) { 
  x <- as.character(substitute(x)) 
  if(isTRUE(x %in% .packages(all.available=TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else { 
    #update.packages(ask= FALSE) #update installed packages.
    eval(parse(text = sprintf("install.packages(\"%s\", dependencies = TRUE)", x)))
  }
  if(isTRUE(x %in% .packages(all.available=TRUE))) { 
    eval(parse(text = sprintf("require(\"%s\")", x)))
  } else {
    source("http://bioconductor.org/biocLite.R")
    #biocLite(character(), ask=FALSE) #update installed packages.
    eval(parse(text = sprintf("biocLite(\"%s\")", x)))
    eval(parse(text = sprintf("require(\"%s\")", x)))
  }
}

예:

install.packages.auto(qvalue) # from bioconductor
install.packages.auto(rNMF) # from CRAN

PS : update.packages(ask = FALSE)& biocLite(character(), ask=FALSE)는 시스템에 설치된 모든 패키지를 업데이트합니다. 시간이 오래 걸릴 수 있으며 항상 보증 할 수없는 전체 R 업그레이드로 간주하십시오!


cran 또는 bc에서 패키지를 실제로 사용할 수 있는지 확인하여 향상시킬 수 있습니다. 또한 설치가 실패했거나 패키지가 존재하지 않으면 끝에 라이브러리를 사용하여 오류를 발생시켜야합니다. raw.githubusercontent.com/holgerbrandl/datautils/master/R/loadpack() 에서 개선 된 버전을 참조하십시오.
Holger Brandl

4

setdiff기능을 사용하여 설치되지 않은 패키지를 가져온 다음 설치할 수 있습니다. 아래 샘플에서는 패키지를 설치하기 전에 ggplot2Rcpp패키지가 설치되어 있는지 확인 합니다.

unavailable <- setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages()))
install.packages(unavailable)

한 줄에 위의 내용을 다음과 같이 쓸 수 있습니다.

install.packages(setdiff(c("ggplot2", "Rcpp"), rownames(installed.packages())))

나는 같은 접근법을 사용합니다. installed.packages()[,'Package']대신에 사용할 수도 있습니다 rownames(installed.packages()).
Scudelletti

3

필요한 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);

3

미리보기로 제공되는 RStudio (1.2)의 다음 버전에는 누락 된 패키지 library()require()호출 을 감지 하고 사용자에게 설치하라는 메시지가 표시됩니다.

누락 된 R 패키지 감지

많은 R 스크립트 가 실행을 위해 필요한 패키지를 불러 library()오고 require()로드 하기 위해 열립니다 . 설치하지 않은 패키지를 참조하는 R 스크립트를 열면 RStudio는 필요한 모든 패키지를 한 번의 클릭으로 설치하도록 제안합니다. install.packages()오류가 사라질 때까지 더 이상 반복해서 입력하지 마십시오!
https://blog.rstudio.com/2018/11/19/rstudio-1-2-preview-the-little-things/

이것은 OP의 원래 관심사를 특히 잘 다루는 것 같습니다.

그들 중 다수는 초보 / 중급 R 사용자이며 아직 가지고 있지 않은 패키지를 설치해야한다는 것을 인식하지 못합니다.


2

"아직 가지고 있지 않은 라이브러리를 설치하는 주요 목표"와 "instllaed.packages ()"사용 여부에 관계없이. 다음 함수는 필요한 원래 기능을 숨 깁니다. 이름이 지정된 패키지 "x"를로드하고 확인하려고 시도합니다 (설치되어 있지 않은 경우 종속성을 포함하여 직접 설치). 마지막으로 정상적으로로드하십시오. 무결성을 유지하기 위해 함수 이름을 'require'에서 'library'로 이름을 바꿉니다. 패키지 이름을 인용해야합니다.

require <- function(x) { 
  if (!base::require(x, character.only = TRUE)) {
  install.packages(x, dep = TRUE) ; 
  base::require(x, character.only = TRUE)
  } 
}

따라서 R의 구식 방식 인 패키지를로드하고 설치할 수 있습니다. require ( "ggplot2") require ( "Rcpp")


더 이상 답변이 마음에 들지 않으면 파손하지 말고 삭제하십시오.
Michael Petrotta 2011

글쎄, 나는 시도했지만 할 수 없었다. FF의 NoScript 확장 프로그램에서 FF를 사용 중지했거나 본인의 답변을 삭제할 권리와 크레딧이 없습니다. LoL 그러나 나는 Livius가 내 대답에 아주 가깝다고 생각합니다. 감사합니다. Michael Petrotta. 알림.
GeoObserver

delete이 주석 위에 링크 가 표시되어야합니다 . 삭제하지 않고 계속 삭제하려면 flag링크를 사용하고 "기타"를 선택한 다음 답변을 제거 할 중재자에게 설명하십시오.
Michael Petrotta

2

아주 기본적인 것입니다.

pkgs = c("pacman","data.table")
if(length(new.pkgs <- setdiff(pkgs, rownames(installed.packages())))) install.packages(new.pkgs)

2

내가 사용하는 것을 공헌하겠다고 생각했습니다.

testin <- function(package){if (!package %in% installed.packages())    
install.packages(package)}
testin("packagename")

2
source("https://bioconductor.org/biocLite.R")
if (!require("ggsci")) biocLite("ggsci")

2

랩 패밀리 및 익명 함수 접근 방식을 사용하면 다음을 수행 할 수 있습니다.

  1. 나열된 모든 패키지를 첨부하십시오.
  2. 누락 만 설치 || 지연 평가 사용)
  3. 1 단계에서 누락되었고 2 단계에서 설치 한 것을 다시 첨부하십시오.
  4. 각 패키지 최종로드 상태 ( TRUE/ FALSE)를 인쇄하십시오 .

    req <- substitute(require(x, character.only = TRUE))
    lbs <- c("plyr", "psych", "tm")
    sapply(lbs, function(x) eval(req) || {install.packages(x); eval(req)})
    
    plyr psych    tm 
    TRUE  TRUE  TRUE 

1

다음을 사용하여 패키지가 설치되어 있고 종속성이 업데이트되었는지 확인한 다음 패키지를로드합니다.

p<-c('ggplot2','Rcpp')
install_package<-function(pack)
{if(!(pack %in% row.names(installed.packages())))
{
  update.packages(ask=F)
  install.packages(pack,dependencies=T)
}
 require(pack,character.only=TRUE)
}
for(pack in p) {install_package(pack)}

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

1

여기 내 코드가 있습니다 :

packages <- c("dplyr", "gridBase", "gridExtra")
package_loader <- function(x){
    for (i in 1:length(x)){
        if (!identical((x[i], installed.packages()[x[i],1])){
            install.packages(x[i], dep = TRUE)
        } else {
            require(x[i], character.only = TRUE)
        }
    }
}
package_loader(packages)

1
 48 lapply_install_and_load <- function (package1, ...)
 49 {
 50     #
 51     # convert arguments to vector
 52     #
 53     packages <- c(package1, ...)
 54     #
 55     # check if loaded and installed
 56     #
 57     loaded        <- packages %in% (.packages())
 58     names(loaded) <- packages
 59     #
 60     installed        <- packages %in% rownames(installed.packages())
 61     names(installed) <- packages
 62     #
 63     # start loop to determine if each package is installed
 64     #
 65     load_it <- function (p, loaded, installed)
 66     {
 67         if (loaded[p])
 68         {
 69             print(paste(p, "loaded"))
 70         }
 71         else
 72         {
 73             print(paste(p, "not loaded"))
 74             if (installed[p])
 75             {
 76                 print(paste(p, "installed"))
 77                 do.call("library", list(p))
 78             }
 79             else
 80             {
 81                 print(paste(p, "not installed"))
 82                 install.packages(p)
 83                 do.call("library", list(p))
 84             }
 85         }
 86     }
 87     #
 88     lapply(packages, load_it, loaded, installed)
 89 }

1
library <- function(x){
  x = toString(substitute(x))
if(!require(x,character.only=TRUE)){
  install.packages(x)
  base::library(x,character.only=TRUE)
}}

이것은 인용되지 않은 패키지 이름으로 작동하며 상당히 우아합니다 (GeoObserver의 답변 참조)


1

필자의 경우 명령 줄에서 실제로 실행할 수있는 하나의 라이너를 원했습니다 (실제로 Makefile을 통해). 다음은 "VGAM"및 "feather"가 아직 설치되지 않은 경우 설치하는 예입니다.

R -e 'for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")'

R 내에서 다음과 같습니다.

for (p in c("VGAM", "feather")) if (!require(p, character.only=TRUE)) install.packages(p, repos="http://cran.us.r-project.org")

이전 솔루션 외에는 다음을 제외하고는 아무것도 없습니다.

  • 한 줄로 유지
  • repos매개 변수를 하드 코딩합니다 (거울 사용을 묻는 팝업을 피하기 위해)
  • 다른 곳에서 사용할 함수를 정의하지 않아도됩니다.

또한 중요하다는 점에 유의하십시오 character.only=TRUE(없는 경우 require패키지를로드하려고 시도합니다 p).


0
  packages_installed <- function(pkg_list){
        pkgs <- unlist(pkg_list)
        req <- unlist(lapply(pkgs, require, character.only = TRUE))
        not_installed <- pkgs[req == FALSE]
        lapply(not_installed, install.packages, 
               repos = "http://cran.r-project.org")# add lib.loc if needed
        lapply(pkgs, library, character.only = TRUE)
}

0

약간의 광기를 공유하겠습니다 :

c("ggplot2","ggsci", "hrbrthemes", "gghighlight", "dplyr") %>%  # What will you need to load for this script?
  (function (x) ifelse(t =!(x %in% installed.packages()), 
    install.packages(x[t]),
    lapply(x, require))) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.