0Pricing
R Academy · บทเรียน

การส่งแพ็กเกจไปยัง CRAN และการบำรุงรักษา

เรียกใช้ R CMD check แก้ปัญหา NOTE/WARNING และส่งแพ็กเกจไปยัง CRAN

การส่งแพ็กเกจไปยัง CRAN และการบำรุงรักษา เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

กระบวนการส่งแพ็กเกจไปยัง CRAN

CRAN (Comprehensive R Archive Network) คือคลังแพ็กเกจ R อย่างเป็นทางการ การส่งแพ็กเกจต้องผ่านการตรวจสอบอัตโนมัติและการตรวจทานโดยมนุษย์ตามนโยบายที่เข้มงวด กระบวนการมีดังนี้: เตรียม → ตรวจสอบ → สร้าง → ส่ง → ปรับแก้ตามข้อเสนอแนะ

devtools::check() — ไม่มีข้อผิดพลาดและคำเตือน

ก่อนส่งแพ็กเกจ 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() สร้างชุดแพ็กเกจต้นฉบับ .tar.gz (เช่น mypackage_0.1.0.tar.gz) ที่เหมาะสำหรับส่งไปยัง CRAN ใช้ 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 จากนั้นจึงส่ง .tar.gz ไปยัง https://cran.r-project.org/submit.html โดยใช้เว็บ API ของ CRAN

# 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() — ตรวจสอบบนแพลตฟอร์ม Linux/Windows หลายแบบผ่าน R-hub
  • 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 CMD เป็นอัตโนมัติทุกครั้งที่มีการพุช โดยใช้ r-lib/actions usethis::use_github_action('check-standard') จะสร้างเวิร์กโฟลว์ที่ตรวจสอบบน Ubuntu, macOS และ Windows ด้วย R หลายเวอร์ชัน

# 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
  • แก้ไขความล้มเหลวในการตรวจสอบของ CRAN ภายใน 14 วัน (ตามนโยบายของ 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')
  • ใช้ GitHub Actions กับ r-lib/actions เพื่อทำ CI เมื่อมีการพุช
  • ตอบข้อเสนอแนะของผู้ตรวจทานภายใน 14 วัน

คำถามที่พบบ่อย

บทเรียน “การส่งแพ็กเกจไปยัง CRAN และการบำรุงรักษา” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การส่งแพ็กเกจไปยัง CRAN และการบำรุงรักษา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การส่งแพ็กเกจไปยัง CRAN และการบำรุงรักษา”

เรียกใช้ R CMD check แก้ปัญหา NOTE/WARNING และส่งแพ็กเกจไปยัง CRAN คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การส่งแพ็กเกจไปยัง CRAN และการบำรุงรักษา” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โครงสร้างแพ็กเกจด้วย usethis และ devtools
  2. การจัดทำเอกสารฟังก์ชันด้วย roxygen2
  3. การทดสอบหน่วยด้วย testthat
  4. การส่งแพ็กเกจไปยัง CRAN และการบำรุงรักษา
← กลับไปที่ R Academy