[R] R 패키지 오프라인 설치를 위한 방법(on CentOS) - 1. 의존성 패키지 한번에 받기

etc-image-0

해당 포스트는 R 패키지를 인터넷이 안되는 오프라인 환경에서 설치하는 방법을 소개하는 글입니다.


Lists
1탄 : 의존성 패키지들 다운받는 사용자 함수 이용하기
2탄 : miniCRAN 이용하기


1. INTRO

일반적으로 공공 기관이나 회사와 같이 보안이 강화된 곳은 R패키지를 제공하는

CRAN 사이트의 접근이 막혀있는 경우

가 많습니다. 이런 경우 인터넷이 되는 곳에서 설치하려는 패키지들을 다운받아 옮겨야 하는데, 의존성 패키지가 많은 경우 패키지들을 하나씩 확인하며 받기에는 너무 많은 노력이 필요합니다.

아래에서는 이러한 노력을 줄여주기 위해 많이 사용되는 2가지 방법을 소개하고자 합니다.

etc-image-1
▲ R 패키지 의존성

2. 방법1: package_dependencies() 활용

첫번째 방법은 R에서 제공하는 시스템 함수인 tools::package_dependencies()를 사용하는 것입니다. 해당 함수를 사용하게 되면 대상 패키지의 의존성 패키지들(Depends, Imports)을 확인할 수 있으며, 확인된 패키지들을 리스트화 하여 일괄적으로 다운받아 사용하면 됩니다.

1. getDependencies() 사용자 함수 생성

먼저 설치하려는 패키지의 의존성 패키지들을 리스트화 해주는 사용자 함수 getDependencies()를 만들겠습니다.

R Script

getDependencies <- function(package_name){

  packages_list <- unlist(
    tools::package_dependencies(packages = package_name, db = available.packages(),
                                which = c("Depends", "Imports"),
                                recursive = TRUE))
  packages_list <- union(package_name, packages_list)

  return(packages_list)
}

(예시) ggplot2 패키지 적용결과

getDependencies("ggplot2")
##  [1] "ggplot2"      "digest"       "glue"         "grDevices"    "grid"        
##  [6] "gtable"       "isoband"      "MASS"         "mgcv"         "rlang"       
## [11] "scales"       "stats"        "tibble"       "withr"        "utils"       
## [16] "methods"      "graphics"     "nlme"         "Matrix"       "splines"     
## [21] "farver"       "labeling"     "lifecycle"    "munsell"      "R6"          
## [26] "RColorBrewer" "viridisLite"  "ellipsis"     "fansi"        "magrittr"    
## [31] "pillar"       "pkgconfig"    "vctrs"        "lattice"      "colorspace"  
## [36] "cli"          "crayon"       "utf8"        

2-1. 1개 패키지만 받는 경우

위에서 생성한 사용자 함수 getDependencies()를 통해 추출한 의존성 패키지 목록을 다운받으려면 R 시스템 함수인 download.packages()를 이용하면 됩니다.

사용법

download.packages(pkgs = getDependencies("패키지명"), destdir = "저장경로", type = "source") # For CentOS
# download.packages(pkgs = getDependencies("패키지명"), destdir = "저장경로", type = "win.binary") # For Windows

예시 : ggplot2 의존성 패키지 다운받기

download.packages(pkgs = getDependencies("ggplot2"), destdir = "d:/temp", type = "source") # For CentOS
# download.packages(pkgs = getDependencies("패키지명"), destdir = "저장경로", type = "win.binary") # For Windows

getDependencies()를 통해 얻은 패키지 수와 저장된 패키지 수가 다를 수 있습니다. 이는 getDependencies()에서 시스템 기본 패키지들을 리스트에 포함시켰으나 다운이 되지 않아 발생한 차이로 시스템 패키지는 기본적으로 내장되어 있으니 신경쓰지 않으셔도 됩니다.

etc-image-2
▲ 'ggplot2' 패키지 다운로드 결과
etc-image-3
▲ 시스템 패키지 에러 메시지

2-2. 2개 이상 패키지를 받는 경우

위에서 생성한 사용자 함수 getDependencies()를 사용하는 것은 동일하며, 다운받으려는 패키지들을 리스트화(pkgs_list)하여 아래와 같이 적용하면 됩니다.

사용법

download_dir <- "저장경로"
pkgs_list <- c("패키지명1","패키지명2",...,"패키지명n")
packages <- getDependencies(pkgs_list) # Get dependencies
download.packages(pkgs = packages, destdir = download_dir, type = "source") # For CentOS
# download.packages(pkgs = packages, destdir = download_dir, type = "win.binary") # For Windows

예시 : 다수 패키지의 의존성 패키지 다운받기

download_dir <- "d:/temp"
pkgs_list <- c("robustfa","ggplot2","robustfa","ggplot2","GPArotation","gplots","RColorBrewer","semPlot","stats","MASS","xgboost","caret","glmnet","rpart","nnet","zoo","ica")
packages <- getDependencies(pkgs_list) # Get dependencies
download.packages(pkgs = packages, destdir = download_dir, type = "source") # For CentOS
# download.packages(pkgs = packages, destdir = download_dir, type = "win.binary") # For Windows

etc-image-4
▲ 다수 패키지의 의존성 패키지 목록 확인
etc-image-5
▲ 다수 패키지 다운로드 결과

3. 다운된 패키지 파일 확인

다운이 완료되면 지정했던 폴더(download_dir)에 파일들이 생성된 것을 확인할 수 있습니다. 이제 해당 파일들을 복사 또는 업로드하여 옮겨주시면 됩니다.

etc-image-6
▲ 다운로드된 패키지 확인

3. 패키지 설치하기

다운받은 패키지들을 설치하려는 PC 또는 서버로 옮기셨다면, 해당 폴더를 워킹 디렉토리로 설정(setwd())하여 아래 명령어를 실행하면 됩니다.

3-1. 설치할 패키지가 1개인 경우

setwd("d:/temp")

install.packages("ggplot2_3.3.3.tar.gz", repos=NULL, type="source") # For CentOS
# install.packages("ggplot2_3.3.3.tar.gz", repos=NULL, type="win.binary") # For Windows
library(ggplot2) 

etc-image-7
▲ 'ggplot2' 패키지 설치 예시

3-2. 설치할 패키지가 2개 이상인 경우

# work directory 안의 모든 .tar.gz 파일 설치 
install.packages(list.files(pattern = "*.tar.gz"), repos=NULL, type='source') # For CentOS
# install.packages(list.files(pattern = "*.tar.gz"), repos=NULL, type='win.binary') # For Windows

4. 마무리

이번 포스트에서는 R 패키지를 인터넷이 안되는 오프라인 환경(on CentOS)에서 설치하는 방법

의존성 패키지들을 한번에 다운받아 설치하는 방법

를 설명하였습니다. 위에서 소개드린 getDependencies 함수는 1차 dependency를 확인하여 수집하는 함수이며, 1차 dependency에 2차, 3차 dependency 패키지가 있는 경우 추가 작업이 필요합니다.

설치 패키지가 많은 경우, 아래 구조와 같은 반복문을 만들어 사용하면 시간은 오래 걸리지만 효율적으로 해결이 될 것 같습니다.

  1. 설치가 필요한 pkgs_list 작성
  2. pkgs_list에서 한 item씩 뽑아서 dependencies 확인 및 다운로드 (트리탐색)
    ex> if (length(getDependencies(pkgs_name)) == 0) next;

위에서 소개드린 방법 외에 miniCRAN 패키지를 활용하는 방법 은 다음편에서 소개드리도록 하겠습니다.

5. 관련 링크

[1] R 패키지를 오프라인 환경에서 설치하는 방법
[2] R 패키지 오프라인 설치를 위한 방법(on CentOS) - 1. 의존성 패키지 한번에 받기
[3] R 패키지 오프라인 설치를 위한 방법(on CentOS) - 2. miniCRAN 이용하기