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 →