R Academy · 강의

CRAN 제출과 패키지 유지 관리

R CMD check을 실행하고 NOTE/WARNING 문제를 해결한 뒤 CRAN에 제출합니다.

레슨 4/413개 단계

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 -20

devtools::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 checks

CRAN 검토자 피드백 처리하기

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. usethis와 devtools로 패키지 구조 만들기
  2. roxygen2로 함수 문서화
  3. testthat으로 단위 테스트하기
  4. CRAN 제출과 패키지 유지 관리
← R Academy(으)로 돌아가기