Recycled R - 패키지를 만들자

오늘 소개드릴 내용은 직접 R에서 사용하는 패키지를 만드는 방법입니다.  자신만의 패키지를 작성하는 것은 Code Recycle은 물론 Sharing과 Documentation에 큰 도움이 됩니다.

물론 save.image()로 현재 작업내용을 저장 할 수도 있고, source()나 CMD BATCH 커맨드라인 명령을 이용하여 미리 작성한 스크립트를 불러들여서 실행할 수도 있습니다.  그렇지만 패키지를 작성하게 되면 보다 본격적으로 문서 - vignette, help 등 - 작업을 준비하게 됨으로써 더 체계적인 정리가 가능하고, 이 후 배포를 용이하게 만들어 줍니다.

아래는 Hilary Parker의 블로그 Not So Standard Deviation의 2014년 포스팅인 Writing an R package from scratch의 번역된 요약으로,  R 패키지 작성에 대한 기존의 다른 튜토리얼보다 더 접근하기 쉽게 정리되어있어서 여기서 소개하려고 합니다.  기존에는 번거로웠던 커맨드라인의 패키지 빌딩 과정과 문서화 작업을 roxygen2 패키지를 이용해서 손쉽게 구현하는 방법을 소개하고 있습니다.  여기서는 현재 버전에서 변경된 부분을 다듬고, 좀 더 따라하기 용이하도록 약간의 소스를 추가했습니다.

Not So Standard Deviation
Hilary Parker
https://hilaryparker.com/

편의상 지루한 번역문이 되었지만 Parker의 본문은 매우 유머러스하므로 직접 링크 글을 참조하셔도 좋습니다.


여기서 소개드리려는 것은 완벽한 상업용 R패키지를 만드는 법이 아니라 최소한의 형식을 갖춘 패키지를 손쉽게 만드는 방법입니다.  자주 사용하는 R코드를 패키지화 하면 단순히 반복 사용이 용이해질 뿐 아니라 코드 공유나 문서화도 용이해지는 장점이 있습니다.  간단하지만 이렇게 작은 패키지를 작성하고 그것을 점차 확장해 나가다 보면, 어느새 하나의 훌륭한 패키지가 구축되어 있을 것입니다.

R패키지에 대한 좀 더 자세한 형식에 대해서는 Hadley Wickham의 Advanced R Programming 이라는 책의 이 챕터를 참조하시기 바랍니다.

Step 0: 준비 사항

자신만의 R패키지를 만들기 위해서는 제일 먼저 roxygen2와 devtools 패키지를 설치해야합니다.

devtools를 설치하기 위해서는 OpenSSL과 CURL의 헤더파일이 필요하므로, 사용하는 시스템이 Ubuntu라면 libssl-dev과 libcurl4-openssl-dev, 기타 배포판에서는 openssl이나 openssl-devel과 같은 라이브러리가 필요합니다.  apt-get 등 각자의 배포판에서 제공하는 패키지 매니저로 해당 라이브러리를 설치하시기 바랍니다.

1
2
3
4
>install.packages("devtools")
>install.packages("roxygen2")
>library(devtools)
>library(roxygen2)

 Step 1: 패키지 경로를 만듭니다

먼저 작성할 패키지의 폴더를 만듭니다.  여기서는 고양이에 관한 가상의 함수를 포함하는 패키지를 예제로 만들어보겠습니다.

1
2
setwd("test")
create("cats")

예제에서는 test라는 작업 폴더를 사용하겠습니다.  위의 구문을 실행하면  test에 cats라는 폴더가 생성된 것을 확인할 수 있습니다.  이 폴더가 작성할 패키지가 저장되는 위치입니다.

cats폴더를 열어보면 R이라는 이름의 폴더와 몇 개의 파일이 보입니다.

cats

패키지의 기본정보에 대해서는 DESCRIPTION파일을 수정해서 우리가 작성할 패키지에 대한 기본적인 정보를 입력하겠습니다.  이때 이메일 주소 — 여기서는 first.last@example.com — 는 윈도우버전용 패키지를 빌드하는데 필요하므로 윈도우 겸용 패키지를 만들때는 반드시 올바르게 적으셔야 합니다.

1
2
3
4
5
6
7
8
9
Package: cats
Title: What the Package Does (one line, title case)
Version: 0.0.0.9000
Authors@R: person("First", "Last", email = "first.last@example.com", role = c("aut", "cre"))
Description: What the package does (one paragraph).
Depends: R (>= 3.3.0)
License: What license is it under?
Encoding: UTF-8
LazyData: true

Step 2: 함수를 작성합니다.

이미 작성된 함수가 있다면 그 스크립트 파일을 위에서 생성된 R폴더에 복사하세요.  아직 작성된 함수가 없다면, 아래와 같은 간단한 코드를 가지고 예제를 작성하셔도 됩니다.

1
2
3
4
5
6
7
8
cat_function <- function(love=TRUE){
    if(love==TRUE){
        print("I love cats!")
    }
    else {
        print("I am not a cool person.")
    }
}

위의 파일을 R폴더에 cat_function.R라는 이름으로 저장합니다.

Step 3: 문서작업을 추가합니다.

문서작업은 항상 지루하고 번거롭습니다만, roxygen2 패키지 덕분에 이젠 모든 것을 매우 간단하고 빠르게 작성할 수 있습니다.  단순히 각 함수 도입부에 코멘트를 삽입하기만 하면, 패키지 컴파일 시 그 내용이 해당 함수의 설명 문서에 삽입됩니다.

좀더 자세한 사항은 roxygen2의 문서를 참고하세요.

다음은 cats 함수를 이용한 예제입니다.  cat함수 도입부에 다음과 같이 코멘트를 삽입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#' A Cat Function
#'
#' This function allows you to express your love of cats.
#' @param love Do you love cats? Defaults to TRUE.
#' @keywords cats
#' @export
#' @examples
#' cat_function()
cat_function <- function(love=TRUE){
    if(love==TRUE){
        print("I love cats!")
    }
    else {
        print("I am not a cool person.")
    }
}

개인적으로는 매 함수마다 별도의 파일을 작성하는 것을 선호합니다만, 하나의 파일에 여러 함수를 작성하는 것이 편하다면, 각각의 함수 도입부에 주석을 추가해주시면 됩니다.

Step 4: 문서화 작업

이제 작성한 주석에서 문서를 생성하겠습니다.  3단계에서 힘든 부분은 모두 끝났으므로 여기서는 다음과 같은 명령만 수행하면 됩니다.

1
2
>setwd("./cats")
>document()

 이 명령은 자동적으로 man 디렉토리에 .Rd파일을 추가하고 주 디렉토리에 NAMESPACE파일 내용을 추가합니다.  세부 작업내용에 대한 설명은 문서 를 참조하시길 바랍니다.  우리가 4 단계에서 할 일은 이것이 전부입니다.

Step 5: 설치

이제 이렇게 생성된 패키지는 cats폴더가 있는 parent 디렉토리에서 install() — install.packages()가 아닙니다! — 명령을 수행함으로써 설치할 수 있습니다.

1
2
setwd("..")
install("cats")

이제 설치가 끝났다면 아래와 같이 HELP페이지를 볼 수 있습니다.

1
?cat_function
cat_function

?cat_function에 대한 도움말 화면

이렇게 생성된 패키지는 Linux의 경우 parent directory에서 — 여기서는 test 폴더에서 — 소스 전체를 압축한 형태로 그대로 일반 패키지처럼 배포가 가능합니다.

1
2
3
4
5
6
# test 디렉토리에서 source 압축
tar cvfz cats.tar.gz cats
# R prompt에서 설치
>install.packages("/home/mittens/test/cats.tar.gz")
# Shell prompt에서 설치
R CMD INSTALL /home/mittens/test/cats.tar.gz

패키지를 윈도우용으로 배포하려는 경우에는 조금 더 복잡한 과정이 필요합니다.  윈도우 버전의  R패키지는 Linux와는 다르게 소스형태가 아닌 컴파일한 바이너리 형태로 배포되기 때문에,  바이너리의 컴파일은 호환성 보장을 위해 로컬에서 행하지 않고 R-Project 서버에 소스를 제출해서 컴파일된 버전을 다운 받는 방식으로 진행됩니다.  자세한 과정은 이 곳을 참조하시기 바랍니다.

devtools의 build_win()을 이용하면 이러한 작업 역시  R내부에서 해결할 수 있습니다.

1
2
3
4
5
6
7
8
> setwd("c:/test")
> build_win("cats")
Building windows version of cats for R-devel with win-builder.r-project.org.
Email results to first.last@example.com?
1: Yes
2: I forget
3: No
선택:

작성이 끝난 패키지는 개인적으로 배포하시거나 CRAN에 등록해서 배포할 수 있습니다.  CRAN에 등록하는 과정은 여기서는 생략하겠습니다.

(옵션) Step 6: GitHub 저장소에 패키지 repo 만들기

이 글은 git이나 GitHub에 대한 글이 아니므로 GitHub 자체에 대해서는 Karl Broman의 Git/GitHub Guide.를 참조하시기 바랍니다.

자신의 패키지를 GitHub에 올리게 되면 devltools install_github() 명령을 이용해서 해당 함수를 GitHub에서 직접 설치할 수 있는 장점이 있습니다.

1
install_github('cats','github_username')

Step 7-무한 반복

이 단계야 말로 패키지를 작성하는 가장 큰 이유일 것입니다.   이제 패키지를 사용하고 개선하면서 계속해서 문서를 갱신할 수 있고 그렇게 작성된 패키지는 최신 버전의 문서와 함께 간단하게 배포가 가능합니다.   새로운 함수를 작성할때마다 패키지에 추가하거나 별도의 패키지를 만들어서 정리할 수도 있습니다.


Popit은 페이스북 댓글만 사용하고 있습니다. 페이스북 로그인 후 글을 보시면 댓글이 나타납니다.