0Pricing
R Academy · Lección

Envío a CRAN y mantenimiento de paquetes

Ejecute R CMD check, resuelva problemas NOTE/WARNING y envíe el paquete a CRAN.

Envío a CRAN y mantenimiento de paquetes es una lección gratuita de R Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

El proceso de envío a CRAN

CRAN (Comprehensive R Archive Network) es el repositorio oficial de paquetes de R. Para enviar un paquete, debe superar comprobaciones automatizadas y una revisión humana conforme a políticas estrictas. El proceso es: preparar → comprobar → compilar → enviar → revisar según los comentarios recibidos.

devtools::check() — Cero errores y advertencias

Antes del envío, devtools::check() debe producir 0 ERRORs y 0 WARNINGs. Se permiten las NOTEs, pero conviene reducirlas al mínimo. Problemas comunes que detecta la comprobación:

  • Funciones o argumentos sin documentar
  • Importaciones de paquetes ausentes en DESCRIPTION
  • Ejemplos que producen errores o tardan demasiado
  • Uso de variables globales (use 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.

Políticas de CRAN — Reglas principales

CRAN aplica políticas estrictas. Estas son las reglas que se infringen con mayor frecuencia:

  • No acceder a Internet desde ejemplos, pruebas o vignettes, salvo que el acceso esté condicionado a su disponibilidad
  • El tiempo total de ejecución de los ejemplos debe ser < 5 segundos — use \dontrun{} o \donttest{} para los ejemplos lentos
  • No escribir en el directorio principal del usuario — use tempdir() en los ejemplos
  • No usar rutas codificadas directamente — todas las operaciones con archivos deben usar rutas relativas 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() — Creación del paquete

devtools::build() crea un paquete fuente en formato .tar.gz (por ejemplo, mypackage_0.1.0.tar.gz) apto para enviarlo a CRAN. Use devtools::build(binary = TRUE) para crear un paquete binario destinado a su distribución en su sistema operativo local.

# 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() — Envío interactivo

devtools::release() ejecuta una lista de comprobación interactiva que le guía por las comprobaciones finales previas al envío, le pide confirmar las políticas de CRAN y, después, envía el archivo .tar.gz a https://cran.r-project.org/submit.html mediante la API web de 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.

Comprobación en varias plataformas

CRAN comprueba los paquetes en varios sistemas operativos y versiones de R. Realice pruebas amplias antes de enviarlo:

  • devtools::check_win_devel() — envía el paquete a win-builder (Windows, R-devel)
  • devtools::check_rhub() — comprueba el paquete en varias plataformas Linux/Windows mediante R-hub
  • devtools::check_mac_release() — comprueba el paquete en 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 — Comunicación de cambios

NEWS.md documenta los cambios entre versiones. CRAN lo exige para las actualizaciones. Formatee cada versión como un encabezado con viñetas que describan los cambios. Los usuarios y los revisores de CRAN lo consultan para entender qué ha cambiado.

# 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() para actualizar versiones

usethis::use_version('minor') incrementa el número de versión en DESCRIPTION y añade un nuevo encabezado provisional en NEWS.md. Use versionado semántico: 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 para integración continua

Automatice la comprobación de R CMD en cada push mediante r-lib/actions. usethis::use_github_action('check-standard') crea un workflow que comprueba el paquete en Ubuntu, macOS y Windows con varias versiones de 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

Gestión de los comentarios de los revisores de CRAN

Los revisores de CRAN pueden solicitar cambios. Estas son algunas solicitudes habituales:

  • Incluir los ejemplos de larga duración en \donttest{}
  • Usar condiciones if (interactive()) para las funciones que abren interfaces de usuario
  • Corregir la ortografía de la documentación (use usethis::use_spell_check())
  • Añadir mensajes de error más descriptivos

Responda pronto y vuelva a enviar el paquete. Es normal que haya varias rondas de revisión.

# 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

Mantenimiento del paquete después de su publicación

Después de que CRAN acepte el paquete, el mantenimiento continuo incluye:

  • Estar atento a las advertencias de obsolescencia de las dependencias en las comprobaciones de R-devel
  • Resolver los fallos de las comprobaciones de CRAN en un plazo de 14 días (política de CRAN)
  • Usar lifecycle::deprecate_warn() para marcar gradualmente como obsoletas las funciones antiguas
  • Configurar usethis::use_github_action('pkgdown') para crear un sitio web de documentación
# 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.

Comprobación rápida: política de ejemplos de CRAN

¿Qué etiqueta debe usar para incluir en la documentación un ejemplo de larga duración sin que el comprobador automatizado de CRAN lo ejecute?

Repaso del envío y mantenimiento en CRAN

El flujo de publicación en CRAN:

  • devtools::check() — se requieren 0 ERRORs y 0 WARNINGs
  • Políticas de CRAN: no usar Internet en los ejemplos, ejemplos de < 5 segundos y usar tempdir() para las escrituras
  • devtools::build() — crea el paquete .tar.gz
  • devtools::release() — envío interactivo guiado
  • Comprobaciones multiplataforma: check_win_devel(), R-hub
  • NEWS.md con encabezados de versión; actualice la versión con use_version('minor')
  • GitHub Actions con r-lib/actions para la integración continua en cada push
  • Responder a los comentarios de los revisores en un plazo de 14 días

Preguntas frecuentes

¿La lección «Envío a CRAN y mantenimiento de paquetes» es gratis?

Sí — el texto completo de «Envío a CRAN y mantenimiento de paquetes» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Envío a CRAN y mantenimiento de paquetes»?

Ejecute R CMD check, resuelva problemas NOTE/WARNING y envíe el paquete a CRAN. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Envío a CRAN y mantenimiento de paquetes»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Estructura de paquetes con usethis y devtools
  2. Documentación de funciones con roxygen2
  3. Pruebas unitarias con testthat
  4. Envío a CRAN y mantenimiento de paquetes
← Volver a R Academy