0Pricing
R Academy · Lezione

Invio a CRAN e manutenzione dei pacchetti

Esegua R CMD check, risolva i problemi NOTE/WARNING e invii il pacchetto a CRAN

Invio a CRAN e manutenzione dei pacchetti è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento R Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso R Academy include 4 lezioni in totale.

Il processo di invio a CRAN

CRAN (Comprehensive R Archive Network) è il repository ufficiale dei pacchetti R. Per inviare un pacchetto è necessario superare i controlli automatici e la revisione umana, nel rispetto di policy rigorose. Il processo è: preparare → controllare → creare il pacchetto → inviare → apportare modifiche in base al feedback.

devtools::check() — zero errori e avvisi

Prima dell'invio, devtools::check() deve produrre 0 ERROR e 0 WARNING. I NOTE sono consentiti, ma è consigliabile ridurli al minimo. Problemi comuni rilevati dal controllo:

  • Funzioni o argomenti non documentati
  • Import mancanti del pacchetto in DESCRIPTION
  • Esempi che generano errori o richiedono troppo tempo
  • Utilizzo di variabili globali (utilizzi 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.

Policy di CRAN — regole fondamentali

CRAN applica policy rigorose. Le regole violate più spesso sono:

  • Nessun accesso a Internet negli esempi, nei test o nelle vignette, a meno che non sia condizionato alla disponibilità
  • Durata complessiva degli esempi < 5 secondi — utilizzi \dontrun{} o \donttest{} per gli esempi lenti
  • Non scrivere nella directory home dell'utente — utilizzi tempdir() negli esempi
  • Nessun percorso hardcoded — tutte le operazioni sui file devono usare percorsi relativi o 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() — creazione del pacchetto

devtools::build() crea un pacchetto sorgente .tar.gz (ad esempio mypackage_0.1.0.tar.gz) adatto all'invio a CRAN. Utilizzi devtools::build(binary = TRUE) per creare un pacchetto binario da distribuire sul sistema operativo locale.

# 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() — invio interattivo

devtools::release() esegue una checklist interattiva che La guida nei controlli finali prima dell'invio, Le chiede di confermare le policy di CRAN e quindi invia il file .tar.gz a https://cran.r-project.org/submit.html utilizzando la web API di 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.

Controllo su più piattaforme

CRAN controlla i pacchetti su più sistemi operativi e versioni di R. Esegua test su più ambienti prima dell'invio:

  • devtools::check_win_devel() — invia il pacchetto a win-builder (Windows, R-devel)
  • devtools::check_rhub() — esegue il controllo su più piattaforme Linux/Windows tramite R-hub
  • devtools::check_mac_release() — esegue il controllo su 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 — comunicare le modifiche

NEWS.md documenta le modifiche tra una versione e l'altra. CRAN lo richiede per gli aggiornamenti. Formatti ogni versione come un'intestazione con un elenco puntato che descriva le modifiche. Gli utenti e i revisori di CRAN lo leggono per capire cosa è cambiato.

# 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() per aggiornare la versione

usethis::use_version('minor') incrementa il numero di versione in DESCRIPTION e aggiunge una nuova intestazione segnaposto in NEWS.md. Utilizzi il versionamento semantico: 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 per l'integrazione continua

Automatizzi R CMD check a ogni push utilizzando r-lib/actions. usethis::use_github_action('check-standard') crea un workflow che esegue i controlli su Ubuntu, macOS e Windows con più versioni di 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

Gestire il feedback dei revisori di CRAN

I revisori di CRAN potrebbero richiedere delle modifiche. Richieste comuni:

  • Racchiudere gli esempi di lunga durata in \donttest{}
  • Utilizzare protezioni if (interactive()) per le funzioni che aprono interfacce utente
  • Correggere l'ortografia nella documentazione (utilizzi usethis::use_spell_check())
  • Aggiungere messaggi di errore più descrittivi

Risponda tempestivamente e invii nuovamente il pacchetto. Più cicli di revisione sono normali.

# 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

Manutenzione del pacchetto dopo il rilascio

Dopo l'accettazione da parte di CRAN, la manutenzione continua include:

  • Controllare la presenza di avvisi di deprecazione delle dipendenze nei controlli con R-devel
  • Risolvere gli errori nei controlli di CRAN entro 14 giorni (policy di CRAN)
  • Utilizzare lifecycle::deprecate_warn() per deprecare gradualmente le vecchie funzioni
  • Configurare usethis::use_github_action('pkgdown') per un sito web di documentazione
# 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.

Verifica rapida: policy di CRAN sugli esempi

Quale tag dovrebbe utilizzare per includere nella documentazione un esempio di lunga durata senza che il controllo automatico di CRAN lo esegua?

Riepilogo dell'invio e della manutenzione su CRAN

Il workflow di rilascio su CRAN:

  • devtools::check() — sono richiesti 0 ERROR e 0 WARNING
  • Policy di CRAN: niente Internet negli esempi, esempi di durata < 5 secondi, utilizzo di tempdir() per le scritture
  • devtools::build() — crea il pacchetto .tar.gz
  • devtools::release() — invio interattivo guidato
  • Controlli multipiattaforma: check_win_devel(), R-hub
  • NEWS.md con intestazioni per le versioni; aggiorni la versione con use_version('minor')
  • GitHub Actions con r-lib/actions per la CI a ogni push
  • Rispondere al feedback dei revisori entro 14 giorni

Domande Frequenti

La lezione «Invio a CRAN e manutenzione dei pacchetti» è gratuita?

Sì — il testo completo di «Invio a CRAN e manutenzione dei pacchetti» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso R Academy, passa a CoddyKit PRO. Il corso R Academy include 4 lezioni in totale.

Cosa imparerò in «Invio a CRAN e manutenzione dei pacchetti»?

Esegua R CMD check, risolva i problemi NOTE/WARNING e invii il pacchetto a CRAN Eserciti R Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare R Academy?

Non è richiesta alcuna esperienza precedente. R Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Invio a CRAN e manutenzione dei pacchetti»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione R Academy?

Sì. Ogni lezione R Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Struttura dei pacchetti con usethis e devtools
  2. Documentazione delle funzioni con roxygen2
  3. Test unitari con testthat
  4. Invio a CRAN e manutenzione dei pacchetti
← Torna a R Academy