Unidad 1: Cálculo de indicadores simples y transformación de la información

Funciones y Bucles en R & RStudio

Introducción

Aprender a programar en R se vuelve muy sencillo cuando entendemos la lógica detrás de cada herramienta. En esta lección aprenderemos cuatro conceptos fundamentales:

  1. Funciones personalizadas: Crearemos nuestras propias herramientas.
  2. Condicional if: Le enseñaremos a R a tomar decisiones.
  3. Ciclo for: Repetiremos acciones un número exacto de veces.
  4. Ciclo while: Repetiremos acciones mientras se cumpla una condición.

Definición de una Función en R

¿Qué es una función?

Imagina una función como una máquina en una fábrica o una receta de cocina:

  • Entradas (Argumentos): Los insumos que le entregas a la máquina.

  • Proceso (Cuerpo): Las instrucciones que realiza la máquina con esos insumos.

  • Salida (Resultado): El producto final que te devuelve.

La Analogía con la Economía (Función Cobb-Douglas): En economía, una Función de Producción (como la Cobb-Douglas \(Y = A \cdot L^\alpha \cdot K^\beta\)) sirve exactamente para ilustrar este concepto: * Le entregas como entradas la cantidad de Trabajo (\(L\)) y Capital (\(K\)). * La máquina procesa estos insumos según el nivel de tecnología (\(A\)). * Te entrega como salida la Producción total (\(Y\)).

Sintaxis Paso a Paso en R

Para construir cualquier función en R, usamos la siguiente estructura básica:

mi_funcion <- function(argumento1, argumento2) {
  # 1. Realizar el cálculo
  resultado <- argumento1 + argumento2
  
  # 2. Devolver el resultado
  return(resultado)
}

Ejemplo Práctico 1: Área de un Rectángulo

Construyamos una función simple que reciba la base y la altura y nos devuelva el área:

# Paso 1: Definir la función
calcular_area_rectangulo <- function(base, altura) {
  area <- base * altura
  return(area)
}

# Paso 2: Usar la función con valores de prueba
area_1 <- calcular_area_rectangulo(base = 5, altura = 3)
cat("El área del rectángulo es:", area_1, "
")
## El área del rectángulo es: 15

Ejemplo Práctico 2: Convertidor de Dólares a Millones de Dólares

Si trabajas con cifras presupuestarias grandes, puedes crear una función que transforme montos en dólares a millones de dólares:

# Función para convertir dólares a millones
dolares_a_millones <- function(monto_dolares) {
  millones <- monto_dolares / 1000000
  return(millones)
}

# Prueba: Convertir $15,500,000 a millones
resultado_millones <- dolares_a_millones(15500000)
cat("Monto en millones:", resultado_millones, "millones USD
")
## Monto en millones: 15.5 millones USD

Condicional “if” (Toma de Decisiones)

El condicional if nos permite ejecutar un bloque de código solo si una condición es verdadera.

La Lógica:

  • if (Si…): Si se cumple la condición A, haz esto.
  • else if (Si no, pero si…): Si no se cumplió la anterior, pero se cumple B, haz esto.
  • else (De lo contrario…): Si no se cumplió ninguna anterior, haz esto otro.

Ejemplo Práctico: Evaluador de Presupuesto

Evaluemos si un gasto en dólares es considerado (“Alto Presupuesto”, “Presupuesto Moderado” o “Bajo Presupuesto”):

evaluar_presupuesto <- function(monto_dolares) {
  millones <- dolares_a_millones(monto_dolares)
  
  if (millones >= 10) {
    print("Categoría: Alto Presupuesto (Mayor o igual a 10 millones USD)")
  } else if (millones >= 2) {
    print("Categoría: Presupuesto Moderado (Entre 2 y 10 millones USD)")
  } else {
    print("Categoría: Bajo Presupuesto (Menor a 2 millones USD)")
  }
}

# Probando la función con diferentes valores
evaluar_presupuesto(15000000)
## [1] "Categoría: Alto Presupuesto (Mayor o igual a 10 millones USD)"
evaluar_presupuesto(5000000)
## [1] "Categoría: Presupuesto Moderado (Entre 2 y 10 millones USD)"
evaluar_presupuesto(500000)
## [1] "Categoría: Bajo Presupuesto (Menor a 2 millones USD)"

Ciclo (Loop) “for”

El ciclo for nos sirve para repetir una tarea un número determinado de veces (por ejemplo, para cada elemento de una lista o para cada mes del año).

Ejemplo Práctico: Convertir las Ventas de los Primeros 6 Meses

Supongamos que tenemos las ventas en dólares para los primeros 6 meses del año y queremos calcular y mostrar la conversión a millones mes por mes:

# Vector con las ventas mensuales en dólares (Enero a Junio)
ventas_mensuales <- c(2000000, 4500000, 12000000, 800000, 3100000, 15000000)
nombres_meses <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio")

# Bucle FOR: Recorre desde el mes 1 hasta el mes 6
for (i in 1:6) {
  mes <- nombres_meses[i]
  monto <- ventas_mensuales[i]
  monto_millones <- dolares_a_millones(monto)
  
  cat("Mes", i, "(", mes, "):", monto_millones, "millones USD
")
}
## Mes 1 ( Enero ): 2 millones USD
## Mes 2 ( Febrero ): 4.5 millones USD
## Mes 3 ( Marzo ): 12 millones USD
## Mes 4 ( Abril ): 0.8 millones USD
## Mes 5 ( Mayo ): 3.1 millones USD
## Mes 6 ( Junio ): 15 millones USD

Ciclo (Loop) “while”

El ciclo while repite una acción mientras una condición siga siendo VERDADERA. Se usa cuando no sabemos exactamente cuántas veces necesitaremos repetir el proceso.

Ejemplo Práctico: Ahorro para un Fondo de Reserva

Imagina que quieres reunir un fondo de reserva de $100 dólares. Empiezas con $0 y ahorras $25 dólares cada semana. ¿Cuántas semanas tomará alcanzar la meta?

meta <- 100
ahorro_actual <- 0
ahorro_semanal <- 25
semana <- 0

# Mientras no hayamos alcanzado la meta, seguimos ahorrando
while (ahorro_actual < meta) {
  semana <- semana + 1
  ahorro_actual <- ahorro_actual + ahorro_semanal
  
  cat("Semana", semana, ": Ahorro acumulado =", ahorro_actual, "USD
")
}
## Semana 1 : Ahorro acumulado = 25 USD
## Semana 2 : Ahorro acumulado = 50 USD
## Semana 3 : Ahorro acumulado = 75 USD
## Semana 4 : Ahorro acumulado = 100 USD
cat("
¡Meta alcanzada en", semana, "semanas!
")
## 
## ¡Meta alcanzada en 4 semanas!

Aplicación Práctica: Resolución de la Ecuación Cuadrática

Para resolver una ecuación cuadrática de la forma \(a x^2 + b x + c = 0\), aplicamos la fórmula general de la escuela:

\[x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}\]

La parte dentro de la raíz (\(b^2 - 4ac\)) se llama discriminante: * Si es negativo, no existen soluciones reales. * Si es cero o positivo, calculamos \(x_1\) y \(x_2\).

Creación de la función

resolver_cuadratica <- function(a, b, c) {
  # 1. Calcular el discriminante
  discriminante <- (b^2) - (4 * a * c)
  
  # 2. Tomar decisión con un 'if' sencillo
  if (discriminante < 0) {
    cat("No tiene soluciones en los números reales.
")
  } else {
    x1 <- (-b + sqrt(discriminante)) / (2 * a)
    x2 <- (-b - sqrt(discriminante)) / (2 * a)
    return(c(x1 = x1, x2 = x2))
  }
}

Demostración Práctica:

# Ejemplo 1: Ecuación con solución real (x^2 - 5x + 6 = 0)
solucion_1 <- resolver_cuadratica(a = 1, b = -5, c = 6)
print(solucion_1)
## x1 x2 
##  3  2
# Ejemplo 2: Ecuación sin solución real (x^2 + 2x + 5 = 0)
resolver_cuadratica(a = 1, b = 2, c = 5)
## No tiene soluciones en los números reales.

Resumen

Estructura ¿Para qué sirve? Ejemplo Sencillo
function() Crear tu propia herramienta reutilizable area <- function(b, h) { b * h }
if / else Tomar decisiones lógicas (Si ocurre X…) if (x > 0) print("Positivo")
for () Repetir un número conocido de veces for (i in 1:5) print(i)
while () Repetir mientras se cumpla una condición while (ahorro < 100) ahorro <- ahorro + 10