CRAN 제출과 패키지 유지 관리
R CMD check을 실행하고 NOTE/WARNING 문제를 해결한 뒤 CRAN에 제출합니다.
CRAN 제출과 패키지 유지 관리은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
CRAN 제출 과정
CRAN(Comprehensive R Archive Network)은 공식 R 패키지 저장소입니다. 패키지를 제출하려면 엄격한 정책에 따른 자동 검사와 사람의 검토를 통과해야 합니다. 과정은 다음과 같습니다. 준비 → 검사 → 빌드 → 제출 → 피드백에 따라 수정
devtools::check() — 오류와 경고 0개
제출하기 전에 devtools::check()에서 ERROR 0개와 WARNING 0개가 나오도록 해야 합니다. NOTE는 허용되지만 최소화해야 합니다. 검사에서 발견되는 일반적인 문제는 다음과 같습니다.
- 문서화되지 않은 함수나 인수
- DESCRIPTION에 패키지 가져오기가 누락됨
- 오류가 발생하거나 실행 시간이 너무 긴 예제
- 전역 변수 사용(
utils::globalVariables()사용)
# devtools::check() # or Ctrl+Shift+E
#
# Target output:
# -- R CMD check results -------------------------
# Duration: 45.3s
# 0 errors v | 0 warnings v | 1 note x
# NOTE: New submission.
#
# 'New submission' is an expected NOTE for first-time packages.
# All actual ERRORs and WARNINGs must be fixed before submitting.CRAN 정책 — 주요 규칙
CRAN은 엄격한 정책을 적용합니다. 가장 자주 위반되는 규칙은 다음과 같습니다.
- 예제, 테스트 또는 비네트에서 인터넷에 접근하지 않기 — 가용성에 따라 조건부로 실행하는 경우는 제외합니다
- 예제의 전체 실행 시간은 < 5초 — 느린 예제에는
\dontrun{}또는\donttest{}를 사용합니다 - 사용자의 홈 디렉터리에 쓰지 않기 — 예제에서는
tempdir()를 사용합니다 - 경로를 하드코딩하지 않기 — 모든 파일 작업에는 상대 경로나
tempdir()를 사용합니다
# Correct: examples that write to tempdir
# #' @examples
# #' tmp <- tempfile()
# #' write.csv(mtcars, tmp)
# #' read.csv(tmp)
# #' unlink(tmp)
#
# Correct: skip slow or network examples
# #' @examples
# #' \dontrun{
# #' # slow operation
# #' fit_big_model(huge_dataset)
# #' }devtools::build() — 패키지 번들 만들기
devtools::build()는 CRAN 제출에 적합한 .tar.gz 소스 번들을 생성합니다(예: mypackage_0.1.0.tar.gz). devtools::build(binary = TRUE)를 사용하면 로컬 OS에 배포할 바이너리 패키지를 생성할 수 있습니다.
# devtools::build()
# => mypackage_0.1.0.tar.gz
#
# What build does:
# 1. Runs devtools::document() to regenerate man/ and NAMESPACE
# 2. Compiles vignettes (if any)
# 3. Bundles R/, man/, DESCRIPTION, NAMESPACE, tests/ etc.
# 4. Excludes files listed in .Rbuildignore
#
# Inspect the bundle:
# tar -tzf mypackage_0.1.0.tar.gz | head -20devtools::release() — 대화형 제출
devtools::release()는 제출 전 최종 검사를 안내하는 대화형 체크리스트를 실행하고, CRAN 정책을 확인하도록 요청한 다음 CRAN의 웹 API를 사용해 .tar.gz를 https://cran.r-project.org/submit.html로 제출합니다.
# devtools::release()
#
# Interactive questions include:
# - Have you checked on R-devel?
# - Have you checked on Windows with win-builder?
# - Is there a single top-level .R file in tests/?
# - Have you removed donttest{} for essential examples?
# - Is the package correctly versioned?
#
# After answering, it submits and emails the CRAN team.여러 플랫폼에서 검사하기
CRAN은 여러 OS와 R 버전에서 패키지를 검사합니다. 제출하기 전에 폭넓게 테스트하세요.
devtools::check_win_devel()— win-builder에 제출합니다(Windows, R-devel)devtools::check_rhub()— R-hub를 통해 여러 Linux/Windows 플랫폼에서 검사합니다devtools::check_mac_release()— macOS에서 검사합니다
# Check on Windows R-devel (submits to win-builder, results emailed):
# devtools::check_win_devel()
#
# Check on multiple platforms via R-hub:
# rhub::check_for_cran() # requires rhub package and account
#
# Minimum: check locally + win-builder before every CRAN submission
cat('CRAN checks on Windows, macOS, and multiple Linux distros
')NEWS.md — 변경 사항 전달하기
NEWS.md에는 버전 간 변경 사항을 기록합니다. CRAN은 업데이트할 때 이 파일을 요구합니다. 각 버전을 제목으로 작성하고, 무엇이 변경되었는지 글머리 기호로 설명하세요. 사용자와 CRAN 검토자는 변경 내용을 파악하기 위해 이 파일을 읽습니다.
# NEWS.md format:
#
# # mypackage 0.2.0
# * Added subtract() function for element-wise subtraction.
# * add() now accepts complex numbers.
# * Fixed bug where add(NA, x) returned 0 instead of NA.
#
# # mypackage 0.1.0
# * Initial CRAN release.
# * Core add() function for numeric addition.
cat('usethis::use_news_md() creates NEWS.md with the right format
')버전 증가를 위한 usethis::use_version()
usethis::use_version('minor')는 DESCRIPTION의 버전 번호를 증가시키고 NEWS.md에 새 자리표시자 제목을 추가합니다. 시맨틱 버전 관리를 사용하세요: major.minor.patch.
# Version bump commands:
# usethis::use_version('patch') # 0.1.0 -> 0.1.1 (bug fixes)
# usethis::use_version('minor') # 0.1.0 -> 0.2.0 (new features)
# usethis::use_version('major') # 0.1.0 -> 1.0.0 (breaking changes)
# usethis::use_version('dev') # 0.1.0 -> 0.1.0.9000 (dev suffix)
#
# CRAN packages should NOT have a dev suffix (e.g., 0.9000)
# Dev suffix signals work-in-progress on GitHub between releases지속적 통합을 위한 GitHub Actions
r-lib/actions를 사용해 푸시할 때마다 R CMD 검사를 자동화하세요. usethis::use_github_action('check-standard')는 여러 R 버전에 걸쳐 Ubuntu, macOS, Windows에서 검사하는 워크플로를 생성합니다.
# usethis::use_github_action('check-standard')
# Creates .github/workflows/R-CMD-check.yaml
#
# The workflow:
# - triggers on push and pull_request
# - runs on ubuntu-latest, macos-latest, windows-latest
# - tests on R release, R devel, and R oldrel
# - caches installed packages for faster runs
# - reports check results as GitHub status checksCRAN 검토자 피드백 처리하기
CRAN 검토자는 수정을 요청할 수 있습니다. 일반적인 요청은 다음과 같습니다.
- 실행 시간이 긴 예제를
\donttest{}로 감쌉니다 - 사용자 인터페이스를 여는 함수에는
if (interactive())보호문을 사용합니다 - 문서의 맞춤법을 수정합니다(
usethis::use_spell_check()사용) - 더 자세한 오류 메시지를 추가합니다
신속하게 답변하고 다시 제출하세요. 여러 차례 검토가 진행되는 것은 정상입니다.
# Spell check DESCRIPTION and man/ pages:
# usethis::use_spell_check()
# spelling::spell_check_package() # run the check
#
# Add words to WORDLIST to ignore false positives:
# spelling::update_wordlist()
#
# After making all changes:
# devtools::check() # confirm 0 errors/warnings
# devtools::release() # resubmit출시 후 패키지 유지 관리
CRAN 승인 후에는 다음과 같은 지속적인 유지 관리가 필요합니다.
- R-devel 검사에서 종속성으로부터 발생하는 사용 중단 경고를 확인합니다
- 14일 이내에 CRAN 검사 실패를 해결합니다(CRAN 정책)
lifecycle::deprecate_warn()을 사용해 이전 함수를 원활하게 사용 중단합니다- 문서 웹사이트를 위해
usethis::use_github_action('pkgdown')을 설정합니다
# Mark a function as deprecated:
# library(lifecycle)
#
# old_add <- function(x, y) {
# lifecycle::deprecate_warn('0.2.0', 'old_add()', 'add()')
# add(x, y)
# }
#
# Users see: 'old_add()' was deprecated in mypackage 0.2.0.
# Please use 'add()' instead.빠른 확인: CRAN 예제 정책
CRAN의 자동 검사기가 실행하지 않도록 문서에 실행 시간이 긴 예제를 포함하려면 어떤 태그를 사용해야 하나요?
CRAN 제출 및 유지 관리 복습
CRAN 출시 작업 흐름:
devtools::check()— ERROR 0개와 WARNING 0개가 필요합니다- CRAN 정책: 예제에서 인터넷 사용 금지, 예제 실행 시간 < 5초, 쓰기 작업에는
tempdir()사용 devtools::build()—.tar.gz번들을 생성합니다devtools::release()— 대화형 안내에 따른 제출- 플랫폼 간 검사:
check_win_devel(), R-hub - 버전 제목이 있는
NEWS.md;use_version('minor')로 버전을 증가시킵니다 - 푸시할 때 CI를 실행하는
r-lib/actions기반 GitHub Actions - 14일 이내에 검토자 피드백에 응답합니다
AI 튜터와 함께 R을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 43
- 레슨
- 159
자주 묻는 질문
“CRAN 제출과 패키지 유지 관리” 강의는 무료인가요?
네 — “CRAN 제출과 패키지 유지 관리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“CRAN 제출과 패키지 유지 관리”에서 뭘 배우나요?
R CMD check을 실행하고 NOTE/WARNING 문제를 해결한 뒤 CRAN에 제출합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
R Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“CRAN 제출과 패키지 유지 관리” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- usethis와 devtools로 패키지 구조 만들기
- roxygen2로 함수 문서화
- testthat으로 단위 테스트하기
- CRAN 제출과 패키지 유지 관리