연구하다가 갑자기 뭔 삘이 꽂혀서 R패키지를 개발했는데
생각보다 차근차근 정리된 자료가 없어서 GPT, Gemini와 여러 자료를 참고하면서 생성했다.
혹시 나 같은 일을 하고 있는 사람을 위해
어떻게 R패키지를 개발하는지, 그리고 GitHub에 어떻게 올리는지 정리할테니
잘 참고하길 바란다.
참고로 CRAN에 올리는 건 빡센 기준을 요구한다고 한다.
난 아직 그 단계는 아님...!
0. 사전 설치
이 과정을 하려면 R, Rstudio, git이 필요하다.
아마 이 글을 찾아온 분들은 R과 Rstudio는 있을 것 같고,
git만 새로 설치하면 될 가능성이 높다.
위에 링크 걸어두었으니 눌러서 다운받아서 설치하면 된다.
1. R project 만들기
Rstudio를 켜면 스크립트 창과 콘솔창이 있을텐데,
한 번 쓰고 말 코드는 콘솔창에, 계속 저장해두고 쓸 것은 스크립트창에 쓰면 좋다.
어차피 프로젝트 만드는 코드는 한 번 쓰고 말 것이니까 콘솔창에다가 입력하자.
![](https://blog.kakaocdn.net/dn/OJCLC/btsMaVlKrpu/rTqs6POPvkBwRMWmzGUFc1/img.png)
![](https://blog.kakaocdn.net/dn/PNKcV/btsMbbWa1LD/scjY7cXydlWKFg2N3qVicK/img.png)
setwd("your/directory/path/for/project") # 프로젝트가 들어갈 폴더 설정
getwd() # 제대로 설정되었나 확인
library(devtools) # 없는 경우 install.packages("devtools")를 먼저 진행
library(roxygen2) # 없는 경우 install.packages("roxygen2")를 먼저 진행
devtools::create("mypackage") # 패키지 이름은 본인이 원하는 것으로
그러면 해당 위치에 가면 mypackage라는 폴더가 형성되었을 것이다.
![](https://blog.kakaocdn.net/dn/cOh7T6/btsMcX22M8i/4Qh3GQwYYPqnakkPAeer11/img.png)
이제 폴더에 내용들을 채워넣어야한다.
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 폴더에 저장해주면 된다.
![](https://blog.kakaocdn.net/dn/qLaJV/btsMbBfPZpu/EJBTdJdpbCLVWb1BRcCwa0/img.png)
![](https://blog.kakaocdn.net/dn/ubGWQ/btsMcKv5w3s/9s8AI50aEqwWHDq7SidEvk/img.png)
참고로 주석이 영어가 아니면 다 깨진다. 엉망진창 영어실력이라도 영어로 작성해야... (GPT야 문법에 맞게 수정해줘)
3. Description 파일 작성
저기 mypackage 폴더에 R 밑에밑에밑에 DESCRIPTION이라 되어있는 파일이 있는데
그걸 R로 열어서 보면 아래와 같이 생겼을 것이다.
![](https://blog.kakaocdn.net/dn/NSw6I/btsMbuVsZCa/5K0YdZAbZiEWNeZr71FNck/img.png)
저걸 꼭 양식을 지켜서 해줘야한다. 안 그러면 에러남...
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(내 패키지 함수이름)이 적혀있다.
![](https://blog.kakaocdn.net/dn/cmjFmY/btsMcGUMM4P/fvkq3tY0fBPqxr12kVDum1/img.png)
근데 나는 devtools::document()를 했는데 importFrom이 에러가 나서 하나도 추가가 안 되었다.
그래서 수동으로 수정해주었는데,
무턱대고 수동으로 수정하면 빼먹는 게 있을 수도 있으니
6번 오류검사를 하면 NAMESPACE에서 무슨 에러가 있었는지 설명 다 해주니
그걸 먼저 돌리고 수동으로 수정하다.
6. 오류 검사
devtools::check()
error와 warning은 고치면 되고, notes는 고치거나 버리거나를 선택하면 되는데
최대한 notes도 없는 게 낫긴 하다.
그런데 왜 난 아무리 해도 unable to verify current time과 License가 문제가 있다고 하는지 모르겠다...
(특히 License는 첫 검사 때는 멀쩡했는데 뭐 좀 수정하고 나니 에러가 떠서 더 슬픈 1인)
![](https://blog.kakaocdn.net/dn/bEDvS8/btsMdsuYWNF/DFONgRTrQPvY2UL1VbsoY1/img.png)
7. 설치하고 사용해보기
devtools::install() #setwd()로 현재 디렉토리가 패키지 디렉토리여야한다. 아니면 install("경로 적어줘야함")
library(mypackage)
내 컴퓨터에서 실행하면 당연히 잘 되지....
개인적으로는 8번 과정 후에 남의 컴퓨터에서 남의 파일로 다시 한 번 시행해보기를 권장한다.
8. GitHub에 올리기
올리기 전에 GitHub에 로그인해서 Your Repositories에 가서 New를 눌러준다.
![](https://blog.kakaocdn.net/dn/4GM5j/btsMaRp7MDH/fPx67qTvqDk5f4VO0HXdMK/img.png)
뭐 쫑알쫑알...잘 적어주면 되고
뭔가 생성이 되면 좌측 상단에 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 설명서를 영어로 적는 게 제일 힘든 것 같다.
이제 몇 주간 심심할 때마다 설명서 업데이트 해야지~