일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- R
- openCV
- Artificial Intelligence
- 김양재
- 김양재 목사
- c++
- 김양재 목사님
- 몽고디비
- MongoDB
- 빅 데이타
- No SQL
- Statistics
- node.js
- 데이터 과학
- WebGL
- 확률
- Machine Learning
- 딥러닝
- 빅데이터
- 통계
- probability
- Deep learning
- Big Data
- nodeJS
- 인공지능
- data science
- 주일설교
- 빅 데이터
- 우리들교회
- 빅데이타
- Today
- Total
Scientific Computing & Data Science
[Data Science / Post] R 패키지 작성하기 본문
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) 파일을 참고하시면 되겠습니다.
이것으로 이번 포스팅을 마칩니다.
'Data Science > Posts' 카테고리의 다른 글
[Data Science / Post] Data Science vs Big Data vs Data Analytics (0) | 2017.07.06 |
---|---|
[Data Science / Posts] 인공지능, 빅데이터, 데이터 과학의 10가지 알고리즘 (0) | 2017.03.19 |
[Artificial Intelligence / Posts] 의료 영상에서의 딥러닝 어플리케이션 (0) | 2017.02.12 |
[Data Science / Posts] 데이터 과학 소개 (0) | 2017.02.08 |
[Data Science / Posts] R에서 GPU를 활용하여 병렬 컴퓨팅하기 (2) | 2017.02.06 |