Certificado de R Sintaxis

8h 0m

Aprende la sintaxis básica de R: variables, operadores, estructuras y objetos en este curso esencial para programadores.

Empezar curso

R es un lenguaje de programación especializado en análisis estadístico y visualización de datos que se ha convertido en una herramienta fundamental en campos como la ciencia de datos, la investigación académica y la analítica empresarial. Desarrollado inicialmente por Ross Ihaka y Robert Gentleman en la Universidad de Auckland, R combina la potencia del cálculo estadístico con la flexibilidad de un lenguaje de programación completo.

Características fundamentales de R

La sintaxis de R está diseñada para facilitar el trabajo con datos y operaciones matemáticas. A diferencia de otros lenguajes de programación, R utiliza un enfoque vectorial donde las operaciones se aplican automáticamente a conjuntos de datos completos, eliminando la necesidad de escribir bucles explícitos en muchas situaciones.

El ecosistema de R se basa en paquetes que extienden las funcionalidades básicas del lenguaje. El repositorio oficial CRAN (Comprehensive R Archive Network) alberga miles de paquetes especializados que cubren desde técnicas estadísticas avanzadas hasta visualizaciones interactivas y análisis de big data.

Entorno de desarrollo con RStudio

RStudio representa el entorno de desarrollo integrado más utilizado para R. Esta herramienta proporciona una interfaz gráfica intuitiva que incluye un editor de código con resaltado de sintaxis, un visor de objetos para explorar variables y datasets, y paneles integrados para gráficos y documentación.

La integración entre R y RStudio facilita el flujo de trabajo típico del análisis de datos: importación, limpieza, transformación, modelado y visualización. El entorno permite ejecutar código línea por línea o por bloques, facilitando la experimentación y el desarrollo iterativo.

Sistema de tipos y estructuras de datos

R implementa un sistema de tipos dinámico donde las variables no requieren declaración explícita de tipo. Los tipos básicos incluyen numeric (números decimales), integer (números enteros), character (cadenas de texto), logical (valores booleanos) y complex (números complejos).

Las estructuras de datos en R están optimizadas para el análisis estadístico:

# Vector: secuencia de elementos del mismo tipo
numeros <- c(1, 2, 3, 4, 5)
nombres <- c("Ana", "Luis", "María")

# Factor: vector categórico con niveles definidos
categorias <- factor(c("bajo", "medio", "alto"))

# Lista: colección de elementos de diferentes tipos
datos_mixtos <- list(
  numeros = c(1, 2, 3),
  texto = "ejemplo",
  logico = TRUE
)

Los data frames constituyen la estructura más importante para el análisis de datos, funcionando como tablas donde cada columna puede contener un tipo de dato diferente:

# Data frame: tabla de datos estructurada
estudiantes <- data.frame(
  nombre = c("Ana", "Luis", "María"),
  edad = c(22, 25, 23),
  nota = c(8.5, 7.2, 9.1),
  aprobado = c(TRUE, TRUE, TRUE)
)

Operadores y expresiones

Los operadores aritméticos en R siguen las convenciones matemáticas estándar, pero con capacidades vectoriales que permiten operaciones elemento por elemento:

# Operaciones vectoriales
a <- c(1, 2, 3)
b <- c(4, 5, 6)
suma <- a + b        # Resultado: c(5, 7, 9)
producto <- a * b    # Resultado: c(4, 10, 18)

Los operadores de comparación y lógicos también funcionan de manera vectorial, generando vectores de valores lógicos que son fundamentales para el filtrado de datos:

# Comparaciones vectoriales
edades <- c(18, 25, 17, 30, 22)
mayores_edad <- edades >= 18  # c(TRUE, TRUE, FALSE, TRUE, TRUE)
jovenes_adultos <- edades >= 18 & edades <= 25

Estructuras de control

Las estructuras condicionales en R utilizan la sintaxis tradicional de programación, pero se adaptan al contexto vectorial del lenguaje:

# Condicional simple
if (temperatura > 25) {
  mensaje <- "Hace calor"
} else if (temperatura > 15) {
  mensaje <- "Temperatura agradable"
} else {
  mensaje <- "Hace frío"
}

# Condicional vectorial con ifelse
temperaturas <- c(30, 20, 10, 25)
sensaciones <- ifelse(temperaturas > 25, "Calor", "Fresco")

Los bucles en R incluyen for, while y repeat, aunque el enfoque vectorial del lenguaje reduce significativamente su necesidad:

# Bucle for tradicional
for (i in 1:5) {
  print(paste("Iteración:", i))
}

# Enfoque vectorial más eficiente
numeros <- 1:5
mensajes <- paste("Iteración:", numeros)

Funciones y programación funcional

Las funciones en R son objetos de primera clase, lo que significa que pueden asignarse a variables, pasarse como argumentos y devolverse desde otras funciones. Esta característica habilita un estilo de programación funcional muy efectivo para el análisis de datos:

# Definición de función básica
calcular_media <- function(valores, na.rm = FALSE) {
  if (na.rm) {
    valores <- valores[!is.na(valores)]
  }
  return(sum(valores) / length(valores))
}

# Uso de la función
datos <- c(1, 2, 3, NA, 5)
media_sin_na <- calcular_media(datos, na.rm = TRUE)

Las funciones anónimas (lambda) se utilizan frecuentemente con funciones de orden superior como apply, lapply y sapply:

# Función anónima con lapply
numeros <- list(a = 1:3, b = 4:6, c = 7:9)
medias <- lapply(numeros, function(x) mean(x))

# Aplicación de función a matrices
matriz <- matrix(1:12, nrow = 3)
sumas_filas <- apply(matriz, 1, function(fila) sum(fila^2))

Scopes y closures

El sistema de scopes en R sigue reglas lexicales donde las funciones pueden acceder a variables definidas en su entorno de creación. Los closures permiten que las funciones "recuerden" el entorno en el que fueron creadas:

# Closure que mantiene estado
crear_contador <- function(inicial = 0) {
  contador <- inicial
  
  function(incremento = 1) {
    contador <<- contador + incremento
    return(contador)
  }
}

# Uso del closure
mi_contador <- crear_contador(10)
mi_contador()    # 11
mi_contador(5)   # 16

Sistemas de programación orientada a objetos

R implementa múltiples sistemas de OOP que coexisten y sirven diferentes propósitos. Esta diversidad refleja la evolución histórica del lenguaje y las necesidades específicas de diferentes comunidades de usuarios.

Sistema S3: simplicidad y flexibilidad

El sistema S3 es el más antiguo y utilizado en R. Se basa en clases implícitas donde los objetos son estructuras de datos regulares con un atributo class que determina su comportamiento:

# Creación de objeto S3
persona <- list(
  nombre = "Ana García",
  edad = 28,
  profesion = "Científica de datos"
)
class(persona) <- "Persona"

# Método genérico para la clase Persona
print.Persona <- function(x, ...) {
  cat("Persona:", x$nombre, "\n")
  cat("Edad:", x$edad, "años\n")
  cat("Profesión:", x$profesion, "\n")
}

Sistema S4: formalidad y validación

El sistema S4 introduce clases formales con definiciones explícitas de slots (atributos) y validación automática:

# Definición de clase S4
setClass("Estudiante",
  slots = list(
    nombre = "character",
    edad = "numeric",
    notas = "numeric"
  ),
  validity = function(object) {
    if (object@edad < 0) {
      return("La edad debe ser positiva")
    }
    return(TRUE)
  }
)

# Creación de instancia S4
estudiante <- new("Estudiante",
  nombre = "Luis Martín",
  edad = 22,
  notas = c(8.5, 7.2, 9.0)
)

Sistema R6: referencias y encapsulamiento

El sistema R6 proporciona clases referenciales similares a otros lenguajes orientados a objetos, con encapsulamiento real y métodos públicos y privados:

# Definición de clase R6
Calculadora <- R6Class("Calculadora",
  private = list(
    historial = c()
  ),
  
  public = list(
    sumar = function(a, b) {
      resultado <- a + b
      private$historial <- c(private$historial, 
                           paste(a, "+", b, "=", resultado))
      return(resultado)
    },
    
    obtener_historial = function() {
      return(private$historial)
    }
  )
)

# Uso de clase R6
calc <- Calculadora$new()
calc$sumar(5, 3)

Herencia y polimorfismo

Los sistemas de OOP en R soportan herencia y polimorfismo con diferentes enfoques. En S3, el polimorfismo se logra mediante métodos genéricos que se comportan diferente según la clase del objeto:

# Método genérico que funciona con diferentes clases
resumen <- function(x) {
  UseMethod("resumen")
}

# Implementaciones específicas por clase
resumen.numeric <- function(x) {
  list(media = mean(x), mediana = median(x), desviacion = sd(x))
}

resumen.character <- function(x) {
  list(longitud = length(x), caracteres_unicos = length(unique(x)))
}

En S4 y R6, la herencia permite crear jerarquías de clases más estructuradas:

# Herencia en R6
Vehiculo <- R6Class("Vehiculo",
  public = list(
    marca = NULL,
    modelo = NULL,
    
    initialize = function(marca, modelo) {
      self$marca <- marca
      self$modelo <- modelo
    },
    
    describir = function() {
      paste(self$marca, self$modelo)
    }
  )
)

# Clase derivada
Coche <- R6Class("Coche",
  inherit = Vehiculo,
  
  public = list(
    puertas = NULL,
    
    initialize = function(marca, modelo, puertas) {
      super$initialize(marca, modelo)
      self$puertas <- puertas
    }
  )
)

La sintaxis de R combina simplicidad para tareas básicas con sofisticación para análisis complejos. Su diseño vectorial, múltiples paradigmas de programación y extenso ecosistema de paquetes lo convierten en una herramienta versátil para profesionales que trabajan con datos en cualquier dominio.

Empezar curso

Otros cursos de programación con certificado

Supera todos los retos de R Sintaxis y obtén estos certificados de superación para mejorar tu currículum y tu empleabilidad.

Tecnologías que aprenderás

R Sintaxis

Al finalizar este curso obtendrás

Certificado de superación en R Sintaxis

Certificado de superación en R Sintaxis

Tras completar todas las lecciones y ejercicios del curso R Sintaxis se te genera un enlace con tu certificado para que lo puedas descargar o compartir directamente en cualquier plataforma, siempre accesible.

Accede a todas certificaciones