지식 게시판

R 패키지 개발하기 ~ GitHub에 올리기

미레티아 2025. 2. 9. 20:58
반응형

연구하다가 갑자기 뭔 삘이 꽂혀서 R패키지를 개발했는데
생각보다 차근차근 정리된 자료가 없어서 GPT, Gemini와 여러 자료를 참고하면서 생성했다.
혹시 나 같은 일을 하고 있는 사람을 위해
어떻게 R패키지를 개발하는지, 그리고 GitHub에 어떻게 올리는지 정리할테니
잘 참고하길 바란다.

참고로 CRAN에 올리는 건 빡센 기준을 요구한다고 한다.
난 아직 그 단계는 아님...!


0. 사전 설치
이 과정을 하려면 R, Rstudio, git이 필요하다.
아마 이 글을 찾아온 분들은 R과 Rstudio는 있을 것 같고,
git만 새로  설치하면 될 가능성이 높다.
위에 링크 걸어두었으니 눌러서 다운받아서 설치하면 된다.
 
1. R project 만들기
Rstudio를 켜면 스크립트 창과 콘솔창이 있을텐데,
한 번 쓰고 말 코드는 콘솔창에, 계속 저장해두고 쓸 것은 스크립트창에 쓰면 좋다.
어차피 프로젝트 만드는 코드는 한 번 쓰고 말 것이니까 콘솔창에다가 입력하자.

(1) Rstudio 화면. 참고로 나는 환경설정을 건드려서 배경색과 콘솔창의 위치가 좀 다르다. (2) 콘솔창에 프로젝트 생성하는 코드 입력
setwd("your/directory/path/for/project") # 프로젝트가 들어갈 폴더 설정
getwd() # 제대로 설정되었나 확인
library(devtools) # 없는 경우 install.packages("devtools")를 먼저 진행
library(roxygen2) # 없는 경우 install.packages("roxygen2")를 먼저 진행
devtools::create("mypackage") # 패키지 이름은 본인이 원하는 것으로

그러면 해당 위치에 가면 mypackage라는 폴더가 형성되었을 것이다.

생성된 폴더의 구조

이제 폴더에 내용들을 채워넣어야한다.
 
2. 함수설명 작성
스크립트 창에다가 작성하면 되는데, 기본적인 구조는 아래와 같다.

#' name_of_function1()
#' Explanation of the function1
#'
#' @param input If you need input for the function, write with @param
#' @return Explain results of the function
#' @export
name_of_function <- function(input) {
	a <- input
    return(a)
}

#' name_of_function2()
#' Explanation of the function2
#'
#' ....

 
특이사항은 function 부분을 제외하고는  #' 뒤에다가 작성을 해야 한다는 점이다.
참고로 @param은 없어도 되는데 (해당 함수에서 input값이 필요없다면) @return@export는 반드시 있어야한다.
@export를 기반으로 얘가 추후 설명할 NAMESPACE라는 파일에 어떤 함수가 있는지 저장을 하고,
return() 내에 있는 것만 불러오고 함수가 끝나므로 @return이 필요하다.
이렇게 쫑알쫑알  함수설명을 다 적으면 아까 생성된 mypackage 밑에 R이라는 폴더에 저장해준다.
나는 functions.R이라 저장했는데 사실 이름은 크게 상관없는 것 같다.
만약 함수설명을 한 페이지에 하니까 너무 길어서 여러 페이지로 나누고 싶다면
functionA.R, functionB.R 등등 나눠적어서 R 폴더에 저장해주면 된다.

(좌) 내가 만든 패키지 중 제일 간단한 함수 (우) 해당 파일을 저장해야 하는 위치
참고로 주석이 영어가 아니면 다 깨진다. 엉망진창 영어실력이라도 영어로 작성해야... (GPT야 문법에 맞게 수정해줘)

 
3. Description 파일 작성
저기 mypackage 폴더에 R 밑에밑에밑에 DESCRIPTION이라 되어있는 파일이 있는데
그걸 R로 열어서 보면 아래와 같이 생겼을 것이다.

Description 파일의 기본 모양새

저걸 꼭 양식을 지켜서 해줘야한다. 안 그러면 에러남...
Package: 패키지 이름은 알아서 적어주었다.
Title: 점 찍지 말고 한 줄로 설명해야한다
Version: 보통 첫 배포는 0.1.0으로 시작하는 것 같지만 원하는 버전을 알아서 하면 된다.
Authors: "이름", "성", "중간이름", "이메일", role=c("aut", "cre", "ctb", "trl" 중 해당하는 것만)을 적으면 되는데
이 양식을 안 지키면 에러난다.
한국인은 중간이름이 없으니 , , 이렇게 반점 2개를 남겨둬야한다.
role 설명은 아래와 같다.

"aut"Author, 저자패키지를 작성한 사람
"cre" Creator, 책임자패키지를 관리하는 사람 (보통 "aut"와 함께 사용)
"ctb"Contributor, 기여자코드 일부를 기여한 사람
"trl" Translator, 번역자 패키지 문서를 번역한 사람

Description: 원하는 대로 쓰시고...
License: 콘솔창에 use_mit_license()라고 치면 알아서 만들어주는데,
다른 저작권 방식을 희망하면 다른 걸 써야한다.
MIT lisence는 자유롭게 사용 가능하며 출처 표기만 요구하는 저작권이고,
GPL lisence는 수정 및 배포 시 같은 라이선스를 요구하는 것이고,
CC0 lisence은 저작권 포기하고 누구나 자유롭게 사용하는 것이다.
내 패키지가 GPL을 걸기엔 허접하고 CC0을 하기엔 시간과 노력이 억울하니 MIT를 걸었다. ㅋㅋㅋㅋ
가장 많이 쓰는게 MIT이기도 하고...
Imports: 만든 패키지를 실행하기 위해 미리 끌고와야 하는 패키지이다.
예를 들어, ggplot2, stringr의 패키지에 있던 함수를 응용해서 만든 패키지라면
Imports: gglot2, stringr이라고 적어두어야 한다.
 
4. 더 추가하면 좋은거
4-1) Vignette
약간 설명서 느낌으로, 제작한 함수가 어렵고 복잡하고 그러면 정말로 필수적이다.
난 아직 안 만들었.... (readme 파일에 설명을 다 때려넣은 1인)

usethat::use_vignette("introduction")

 
4-2) 예제 데이터와 같이 패키지에서 제공하는 파일
연습하세요~라고 할 만한 예제를 넣어주고 싶은 경우 쓸 수 있다.

dir.create("inst/extdata", recursive = TRUE) #예제파일을 넣을 폴더 생성
#해당 폴더에 원하는 파일 및 자료를 갖다 넣어준다.
a <- system.file("extdata", "example.file", package = "mypackage") #예제파일 불러오는 법

 
5. NAMESPACE 생성

devtools::document()

 
얘는 패키지의 함수를 외부로 노출시키기 위한 파일이라고 한다.
열어보면 아래처럼 importFrom("패키지이름", "거기서 함수 개발하는데 사용했던 함수명들")과
export(내 패키지 함수이름)이 적혀있다.

내가 만든 패키지의 NAMESPACE

근데 나는 devtools::document()를 했는데 importFrom이 에러가 나서 하나도 추가가 안 되었다.
그래서 수동으로 수정해주었는데,
무턱대고 수동으로 수정하면 빼먹는 게 있을 수도 있으니
6번 오류검사를 하면 NAMESPACE에서 무슨 에러가 있었는지 설명 다 해주니
그걸 먼저 돌리고 수동으로 수정하다.
 
6. 오류 검사

devtools::check()

error와 warning은 고치면 되고, notes는 고치거나 버리거나를 선택하면 되는데
최대한 notes도 없는 게 낫긴 하다.
그런데 왜 난 아무리 해도 unable to verify current time과 License가 문제가 있다고 하는지 모르겠다... 
(특히 License는 첫 검사 때는 멀쩡했는데 뭐 좀 수정하고 나니 에러가 떠서 더 슬픈 1인)

내가만든 패키지 체크 결과

 
7. 설치하고 사용해보기

devtools::install() #setwd()로 현재 디렉토리가 패키지 디렉토리여야한다. 아니면 install("경로 적어줘야함")
library(mypackage)

내 컴퓨터에서 실행하면 당연히 잘 되지....
개인적으로는 8번 과정 후에 남의 컴퓨터에서 남의 파일로 다시 한 번 시행해보기를 권장한다.
 
8. GitHub에 올리기
올리기 전에 GitHub에 로그인해서 Your Repositories에 가서 New를 눌러준다.

GitHub에 가서 repository 추가

뭐 쫑알쫑알...잘 적어주면 되고
뭔가 생성이 되면 좌측 상단에 Branch가 master인지 main인지 확인해두자.
그리고 명령프롬프트로 가서 아래 코드를 실행해준다.

git --version #제대로 깔렸나 확인

git config --global user.name "yourGitHubID" #깃허브 아이디
git config --global user.email "your@email" #회원가입한 이메일

cd "your/folder/for/mypackage" #패키지명까지 작성

git init #이걸 하면 숨김파일로 .git이 생성된다

git remote add origin https://github.com/yourGitHubID/mypackage.git #GitHub에서 만든거 주소.git
git add .  # 모든 파일을 Git에 추가

git commit -m "Initial commit of my R package" #commit은 맘대로 수정가능

git push -u origin master #브런치가 main으로 되어있으면 main으로 해야함!!

처음  실행하면 중간에 로그인하라고 뜰텐데 그냥 로그인하면 되고
나는 origin이 main인데 master로 했다가 branch가 두 개가 되어서 하나 지우고 다시 밀고 다시 깔고를 반복했다.
그러니까... 처음 올릴 때 잘 올리자....


패키지 개발 시에 R 설명서를 영어로 적는 게 제일 힘든 것 같다.
이제 몇 주간 심심할 때마다 설명서 업데이트 해야지~

728x90
반응형