11-06 01:29
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[Data Science / Post] R 패키지 작성하기 본문

Data Science/Posts

[Data Science / Post] R 패키지 작성하기

cinema4dr12 2017. 7. 25. 21:05

Written by Geol Choi | 


데이터 과학 작업을 하다보면 동료들과 협업할 일이 많습니다. 이 경우, 소스 파일에 주석과 사용법을 잘 작성하여 소스 파일을 직접 배포할 수도 있지만, 소스 유지보수/관리 차원 또는 온라인 배포를 위하여 R 패키지를 작성하여 배포하는 것이 바람직합니다.

이번 포스팅에서는 R 패키지를 작성하고 배포하는 방법에 대해 알아보고자 합니다.

1. 필요한 패키지 불러오기

R 패키지 작성을 위하여 필요한 패키지들인 devtools와 roxygen2을 불러옵니다. 만약 설치되어 있지 않다면 설치합니다:


1
2
3
4
5
if (! ("devtools" %in% rownames(installed.packages()))) { install.packages("devtools") }
base::require("devtools")
 
if (! ("roxygen2" %in% rownames(installed.packages()))) { install.packages("roxygen2") }
base::require("roxygen2")
cs

2. 패키지 디렉터리 생성하기

setwd() 함수를 통해 R에서 패키지를 작성할 Working 디렉터리 경로를 설정합니다. 가령, BasicOperations라는 경로를 Working Directory로 설정한다면,


1
setwd("BasicOperations")
cs


이고, 이 경로에서 다음과 같이 패키지 디렉터리를 생성합니다:


1
devtools::create("BasicOperations")
cs


패키지 디렉터리가 생성되면 R Console에 다음과 같은 메시지가 출력될 것입니다:


> devtools::create("BasicOpeartions") Creating package 'BasicOperations' in './' No DESCRIPTION found. Creating with values: Package: BasicOperations 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.4.1) License: What license is it under? Encoding: UTF-8 LazyData: true * Creating `foo.Rproj` from template. * Adding `.Rproj.user`, `.Rhistory`, `.RData` to ./.gitignore


BasicOperations라는 디렉터리가 생성되고, 그 구조는 다음 이미지와 같습니다:




DESCRIPTION 파일은 패키지에 대한 기본정보가 담겨져 있는데 위에서 봤던 R Console 내용과 같습니다. 이 파일을 수정하여 기본적인 패키지 정보를 수정할 수 있습니다.


NAMESPACE라는 파일도 보이는데 다음과 같이 파일을 열어보면 다음과 같이 몇 글자 적혀 있습니다:


# Generated by roxygen2: fake comment so roxygen2 overwrites silently.
exportPattern("^[^\\.]")

NAMESPACE 파일은 roxygen2가 자동으로 생성하는 파일이며, 배포하고자 하는 패키지가 의존하는 라이브러리와 새로 내보내어질 함수 등을 정의합니다.

3. 소스 파일 작성하기

BasicOperations 디렉터리 내 생성된 BasicOperations/R 디렉터리에 기본적인 사칙연산 소스 파일들을 작성합니다:


Add.R

1
2
3
4
5
6
7
8
9
10
11
12
#' Add() Function
#'
#' This function adds a and b
#' @param a ,b : two numbers to be operated
#' @keywords Add
#' @export
#' @examples
#' Add()
 
Add <- function(x, y) {
  return(x + y)
}    
cs


Subtract.R

1
2
3
4
5
6
7
8
9
10
11
12
#' Subtract Function
#'
#' This function subtrac a from b
#' @param a ,b : two numbers to be operated
#' @keywords subtract a from b
#' @export
#' @examples
#' Subtract(3, 2)
 
Subtract <- function(x, y) {
  return(x - y)
}
cs


Multiply.R

1
2
3
4
5
6
7
8
9
10
11
12
#' Multiply() Function
#'
#' This function multiplies a and b
#' @param a ,b : two numbers to be operated
#' @keywords Add
#' @export
#' @examples
#' Multiply()
 
Multiply <- function(x, y) {
  return(x * y)
}
cs


Divide.R

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#' Divide() Function
#'
#' This function divide a by b
#' @param a ,b : two numbers to be operated
#' @keywords Divide
#' @export
#' @examples
#' Divide()
 
Divide <- function(x, y) {
  if(b != 0)
    return(x * y)
  else
    return(Inf)
}
cs



* 주의: Working Directory는 BasicOperations 경로로 유지합니다.

4. 도큐먼트 생성

BasicOperation/ 디렉터리에서 devtools::document() 함수를 실행하여 도큐먼트를 생성합니다:


> devtools::document()
Updating BasicOperations documentation
Loading BasicOperations
Writing Add.Rd
Writing Divide.Rd
Writing Multiply.Rd
Writing Subtract.Rd

도큐먼트는  BasicOperations/man/ 디렉터리 내에 .Rd 라는 확장자 명으로 생깁니다. 이 파일들은 R에서 권장하는 헬프 형식의 도큐먼트 포맷입니다. 가령, devtools 패키지의 패키지 헬프 도큐먼트를 살펴보면,



위의 이미지와 같이 Description, Usage, Arguments, See Also 등이 기본적인 도큐먼트 포맷임을 알 수 있다.


BasicOperations/man/ 디렉터리 내에 Add.Rd 라는 파일을 열어보면,


% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/Add.R
\name{Add}
\alias{Add}
\title{Add() Function}
\usage{
Add(x, y)
}
\arguments{
\item{a}{,b : two numbers to be operated}
}
\description{
This function adds a and b
}
\examples{
Add()
}
\keyword{Add}

와 같이 되어 있음을 알 수 있으며, 이 R Markdown(Rmd) 문서를 편집하여 사용법 등에 대한 정보를 제공할 수 있습니다.

5. 로컬 패키지 설치하기

devtools::install() 함수를 이용하여 개발한 로컬 패키지를 설치합니다:


> devtools::install(pkg="R")
Installing BasicOperations
"C:/PROGRA~1/R/R-34~1.1/bin/x64/R" --no-site-file --no-environ --no-save --no-restore --quiet CMD INSTALL  \
  "E:/MyProjects/R/Working/Projects/020-CreatePackage/BasicOperations"  \
  --library="C:/Users/gchoi/Documents/R/win-library/3.4" --install-tests 

* installing *source* package 'BasicOperations' ...
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
*** arch - x64
* DONE (BasicOperations)
Reloading installed BasicOperation


설치된 패키지의 위치는 C:/Users/{USERNAME}/Documents/R/win-library/{R-VERSION} 위치에 존재합니다. 가령, Windows 7 OS 환경의 제 컴퓨터의 경우는,



과 같습니다.

6. 패키지 로딩 및 테스트

이제 개발한 패키지를 로딩해 봅니다:


> base::require("BasicOperations")
필요한 패키지를 로딩중입니다: BasicOperations


이제 패키지에 작성하였던 함수를 하나씩 테스트 해 봅니다:


> a = 8
> b = 4
> BasicOperations::Add(a, b)
[1] 12
> BasicOperations::Subtract(a, b)
[1] 4
> BasicOperations::Multiply(a, b)
[1] 32
> BasicOperations::Divide(a, b)
[1] 32


각 함수의 도큐먼트 출력되는지도 확인해 봅니다:


맺음말

이번 포스팅에서는 R에서 패키지를 작성하는 방법에 대해 알아보았습니다. 협업 코딩을 할 때 각자의 작업을 모듈로 잘 쪼개고 정의된 입력과 출력에 따라 함수를 잘 작성하는 것 뿐만 아니라 도큐먼트를 잘 정리하는 것도 중요할 것입니다.

패키지 작성 및 배포에 대하여 좀 더 자세한 정보를 얻고자 하시는 분은 Creating R Packages: A Tutorial (Friedrich Leisch) 파일을 참고하시면 되겠습니다.


이것으로 이번 포스팅을 마칩니다.

Comments