본문으로 바로가기



Make your own R package! - 2. R 패키지의 구조에 대하여

category R Programming/Rpackage 2017.07.04 17:00
Make your own R package! - 2. R패키지의 폴더 구조에 대하여

이번 포스팅에서 사용될 R 패키지는 다음과 같다.

library(devtools)

저번 포스팅을 통해서 필자는 r4issactoast 패키지의 기본 뼈대를 만들었고, 만들어진 패키지를 필자의 깃허브(github)와 연동을 시켰다. 이번 포스팅에서는 우리가 만들어 놓은 폴더와 파일들이 패키지에서 어떠한 역할을 하는지에 대하여 알아보자.

R 패키지의 구조

패키지가 깔려있는 폴더에 들어가보면 다음의 파일과 폴더들을 확인 할 수 있을 것이다.

r4issactoast 하위 폴더 구조

r4issactoast 하위 폴더 구조

Rproj, README.md, 그리고 R폴더

  • .Rproj: Rstudio프로젝트 파일로서 패키지와는 직접적인 관련은 없다. 단, 우리가 프로젝트 작업을 할 경우 이 파일을 통해 프로젝트를 열게 되면 여러가지 편리한 점이 있다.

  • README.md: 깃허브 페이지의 README.md파일이다. 보통의 깃허브를 이용해서 패키지를 배포하게되면, README.md파일을 깃허브에서 띄워주므로, 우리가 만드는 패키지의 얼굴이라 생각하면 된다. 하지만 이 파일을 우리가 직접적으로 편집하지 않는다. 앞으로 우리는 Rmd파일을 생성하여 Rmd파일의 결과물로서 md파일을 조정할 예정이다.(현재는 이해하려 하지 않아도 된다.)

  • R폴더: 패키지에 들어갈 함수들을 담고 있는 폴더이다. R패키지의 궁극적인 목표는 바로 이 안에 들어있는 함수들을 언제 어디서나 편리하게 로딩하는데에 있다.

man 폴더에 관하여

man 폴더의 기능은 manual 폴더라고 하면 감이 잡힐 것이다. 패키지가 가지고 있는 여러 함수들을 어떻게 사용하는지에 대한 설명서를 담고 있는 폴더라고 생각하자. 필자의 경우, man폴더에는 현재 r4issactoast의 유일한 함수인 hello()함수에 대한 설명서 파일인 hello.Rd파일이 들어있다. 그리고 파일의 내용은 다음과 같다.

\name{hello}
\alias{hello}
\title{Hello, World!}
\usage{
hello()
}
\description{
Prints 'Hello, world!'.
}
\examples{
hello()
}

그리고 Rstudio에는 이 .Rd파일을 preview해보는 기능이 있는데, 이것을 돌려보면 다음과 같은 화면이 나타난다.

hello.Rd preview

어디선가 많이 본 화면이다. 그렇다. 바로 우리가 패키지를 깔고 함수를 어떻게 쓰는지 모를때, 즐겨 찾는 ?함수명() 설명서 페이지다. 이 사실에서 우리는 R의 함수 설명서 페이지가 특정 태그를 사용하여 작성되고, 그 태그들을 중심으로 html 형식으로 변환 시키는 과정을 거쳐 만들어진다는 것을 알 수 있다.

DESCRIPTION 파일

DESCRIPTION: 우리가 만든 패키지에 대한 정보들을 담고 있다. 보통 이러한 정보들을 메타 데이터(metadata)라고 부르는데, 이 것의 사전적인 의미는 데이터에 관한 데이터이다. 즉, 패키지에 관한 데이터를 담고 있는 파일이다. (접두사 meta는 after 혹은 beyond를 뜻하는 그리스어이지만, about의 의미로 인식되고 있다.)

NAMESPACE 파일

NAMESPACE 파일은 패키지에 사용되는 함수들의 출처를 명확히 정의해주고, 패키지 안에 들어있는 함수들을 패키지 외부에서 접근하는 것을 조절한다. 즉, 패키지 관련한 모든 함수 이름을 통합 관리한다. 또한 여기에서 관리라는 의미는 크게 다음의 두 가지의 경우를 의미한다.

  1. 패키지 R폴더 안에 들어있는 함수들 중에 사용자가 나의 패키지를 불러왔을때 사용할 수 있는 함수와 사용할 수 없는 함수를 설정한다. 예를 들면 다음과 같다. 필자가 r4issactoast 패키지에 fcnA와 fcnB라는 함수를 만들었다고 하자. fcnA는 패키지의 사용자가 사용할 함수이고, fcnB는 패키지의 부가 기능을 돕는데 사용되는 함수이지, 사용자가 사용할 수 있도록 고안된 함수가 아니라고 가정하자. 이 경우 우리는 namespace파일의 설정을 통하여 사용자가 패키지를 설정해도 fcnB 함수를 검색할 수 없도록 만들 수 있다.

  2. 패키지를 만들때 우리는 코드의 처음부터 끝까지 자신이 사용한 코드를 사용하지는 않는다. 어떠한 기능은 다른 패키지의 함수를 차용해서 구현하기도 할 것이다. 예를 들어, 우리가 summary()라는 함수를 사용하려고 할 경우, 어떤 패키지의 summary()함수를 사용할 것인지 정해줘야 한다. 왜냐하면 우리가 사용하고 싶은 패키지 이외의 패키지에 summary()함수가 존재하고 있을 수 있기 때문이다. 이러한 함수 이름이 충돌되는 상황을 관리해주는 것이 바로 NAMESPACE의 기능이다.

이것으로 간단한 패키지 구조에 대하여 알아보았다. 이번 포스팅에서 설명하지 않은 폴더들도 있다. 예를들어, 패키지의 함수가 C같은 다른 프로그래밍 언어와 연결이 되어 있는 경우에는 추가적인 폴더가 있어야한다. 이러한 폴더에 대하여는 앞으로의 패키지 업데이트를 하면서 자연스럽게 다루게 될 것이다. 다음 포스팅에서는 오늘 알아본 각 폴더들과 파일들의 설정을 필자의 r4issatoast 패키지를 예를들어 설명하도록 하겠다.

참고 문헌

[1] Wickham, Hadley. R packages: organize, test, document, and share your code. " O’Reilly Media, Inc.“, 2015.

[2] Jennifer (Jenny) Bryan, Write your own R package STAT 545


SHARE TO



티스토리 툴바