← R EspañolChapter 13 of 13

Mejores Prácticas

## Objetivos de Aprendizaje - Seguir guías de estilo de código R - Escribir código reproducible - Documentar tu trabajo - Usar control de versiones ## Guía de Estilo de R ### Convenciones de Nomenclatura ```r # Variables y funciones: snake_case mi_variable <- 5 calcular_media <- function(x) {} # Constantes: SCREAMING_SNAKE_CASE MAX_ITERACIONES <- 1000 # Evitar nombres de una sola letra (excepto en bucles) # Bueno: for (i in seq_along(elementos)) {} # Malo: for (j in seq_along(elementos)) {} # Ser descriptivo # Bueno: media_poblacion <- 45.2 # Malo: pm <- 45.2 ``` ### Espaciado ```r # Espacios alrededor de operadores x <- 5 + 3 # Bien x<-5+3 # Malo # Espacio después de coma # Bien: media(x, na.rm = TRUE) media(x , na.rm = TRUE) # Malo # Espacio antes de ( en llamadas a funciones # Bien: media(x) media(x, na.rm = TRUE) # Malo: media (x) media (x, na.rm = TRUE) ``` ### Llaves ```r # Llave de apertura en la misma línea if (x > 0) { print("positivo") } else { print("no positivo") } # Siempre usar llaves para bloques de múltiples líneas if (x > 0) print("positivo") # Malo - propenso a errores if (x > 0) { print("positivo") } # Bien ``` ### Longitud de Línea ```r # Mantener líneas bajo 80 caracteres # Romper llamadas largas a funciones resultado <- alguna_funcion( argumento1 = valor1, argumento2 = valor2, argumento3 = valor3 ) # Usar variables para romper cadenas resultado_intermedio <- paso_uno(datos) resultado_final <- paso_dos(resultado_intermedio) ``` ### Indentación ```r # Usar dos espacios para indentación funcion_con_nombre_largo <- function(argumento1, argumento2) { if (condicion) { hacer_algo() } else { hacer_otra_cosa() } } ``` ## Documentación ### Encabezado de Script ```r # Título: Script de Análisis de Datos # Descripción: Realiza análisis en datos de clientes # Autor: Juan Pérez # Fecha: 2024-01-15 # Uso: Rscript analisis.R [archivo_entrada] # Salida: resultados.csv # Cargar paquetes requeridos ----------------------------------------- library(dplyr) library(ggplot2) # Análisis principal ------------------------------------------------- main <- function() { # código aquí } # Ejecutar si se ejecuta como script if (!interactive()) { main() } ``` ### Documentación de Funciones ```r #' Calcular estadísticas resumidas #' #' Calcula media, desviación estándar y conteo para un vector numérico. #' #' @param x Un vector numérico #' @param na.rm Lógico; si TRUE, elimina NAs (por defecto TRUE) #' @param trim La fracción de valores a recortar de cada extremo #' #' @return Una lista nombrada con media, sd y n #' #' @examples #' mi_summary(c(1, 2, 3, 4, 5)) #' mi_summary(c(1, 2, NA), na.rm = TRUE) #' #' @export mi_summary <- function(x, na.rm = TRUE, trim = 0) { # implementación } ``` ### Etiquetas roxygen2 | Etiqueta | Descripción | |----------|-------------| | @param | Descripción del parámetro | | @return | Qué retorna la función | | @examples | Ejemplos de uso | | @export | Exportar función | | @import | Importar de otros paquetes | | @note | Notas adicionales | | @references | Referencias relacionadas | ## Organización de Proyectos ### Estructura de Directorios ```text proyecto/ R/ R/ funciones.R auxiliares.R DESCRIPTION NAMESPACE datos/ raw/ processed/ output/ figuras/ tablas/ vignettes/ README.md DESCRIPTION .Rbuildignore proyecto.Rproj ``` ### Usar Proyectos de RStudio ```r # Crear proyecto en RStudio: Archivo -> Nuevo Proyecto # Beneficios: # - Directorio de trabajo autocontenido # - Gestión de paquetes más fácil # - Integración con control de versiones ``` ## Investigación Reproducible ### set.seed() ```r # Establecer semilla para números aleatorios set.seed(42) # Ahora los resultados son reproducibles rnorm(5) # Siempre lo mismo rnorm(5) # Diferente sin semilla ``` ### Session Info ```r # Capturar info de sesión sessionInfo() # Para documentación de reproducibilidad sink("info_sesion.txt") sessionInfo() sink() ``` ### packrat / renv ```r # Inicializar renv para proyecto renv::init() # Guardar instantánea de dependencias renv::snapshot() # Restaurar desde instantánea renv::restore() ``` ### rmarkdown para Reportes ```r # Crear archivo .Rmd para reportes reproducibles # Combina código, salida y narrativa --- title: "Reporte de Análisis" output: html_document --- {r setup, include=FALSE} library(dplyr) {r cars} summary(cars) {r plot, echo=FALSE} plot(cars) ``` ### Parámetros en Rmarkdown ```r # Usar params para reportes parametrizados --- params: archivo_datos: "datos.csv" umbral: 0.05 --- {r} read.csv(params$archivo_datos) ``` ## Control de Versiones con Git ### Inicializar Repositorio ```bash git init git add . git commit -m "Commit inicial" ``` ### Comandos Comunes ```bash git status # Verificar estado git add archivo.R # Stage archivo git commit -m "Mensaje" git push # Empujar a remoto git pull # Traer de remoto git branch # Listar ramas git checkout -b nueva_caracteristica # Crear y cambiar ``` ### .gitignore ```text # R .Rproj.user/ .Rhistory .RData .Ruserdata/ # Paquetes packrat/lib/ renv/library/ # Salida *.pdf *.png output/ # SO .DS_Store Thumbs.db ``` ## Desarrollo de Paquetes ### Estructura de Paquetes ```text mipaquete/ DESCRIPTION NAMESPACE R/ funcion1.R funcion2.R man/ funcion1.Rd tests/ testthat/ test_funcion1.R vignettes/ intro.Rmd ``` ### Archivo DESCRIPTION ```text Package: mipaquete Title: Lo que Hace el Paquete Version: 0.1.0 Author: Tu Nombre Maintainer: Tu Nombre Description: Descripción del paquete License: MIT Imports: dplyr, tidyr Suggests: testthat, knitr VignetteBuilder: knitr ``` ### Usar devtools ```r library(devtools) create_package("mipaquete") # Crear estructura load_all() # Cargar paquete check() # Verificar paquete document() # Generar documentación build() # Construir paquete ``` ## Pruebas ### Paquete testthat ```r library(testthat) test_that("media funciona correctamente", { expect_equal(mean(1:5), 3) expect_equal(mean(c(1, 2, NA), na.rm = TRUE), 1.5) }) test_that("manejo de errores funciona", { expect_error(calcular_estadisticas("no numérico")) }) ``` ### Ejecutar Pruebas ```r # En desarrollo de paquetes devtools::test() # Ejecutar archivo de prueba específico test_file("tests/testthat/test_funciones.R") ``` ## Lista de Verificación de Revisión de Código ### Antes de Commitear - [ ] El código se ejecuta sin errores - [ ] Las funciones tienen documentación - [ ] Los nombres de variables son descriptivos - [ ] Sin rutas o valores hardcoded - [ ] set.seed() para operaciones aleatorias - [ ] Los comentarios explican por qué, no qué - [ ] Sin código comentado - [ ] Sigue la guía de estilo ### Para Funciones - [ ] Validación de entrada - [ ] Manejo de errores - [ ] Valor de retorno documentado - [ ] Ejemplos proporcionados - [ ] Casos extremos manejados ## Resumen - Seguir convenciones de nomenclatura consistentes (snake_case) - Documentar scripts y funciones - Usar Proyectos de RStudio para organización - Hacer código reproducible con set.seed() y packrat/renv - Usar Rmarkdown para reportes reproducibles - Control de versiones con Git - Escribir pruebas para funciones importantes - Revisar código antes de commitear

Comments

Comments powered by Giscus

To enable comments, add your Giscus embed code here.

Learn more about Giscus →