← R EspañolChapter 04 of 13

Control de Flujo

## Objetivos de Aprendizaje - Dominar declaraciones if, else if, else - Comprender declaraciones switch - Aprender bucles for, while, repeat - Usar break y next (continue) - Aplicar funciones de la familia apply ## Declaración if ### if Básico ```r edad <- 18 if (edad >= 18) { print("Adulto") } ``` ### if-else ```r edad <- 15 if (edad >= 18) { print("Adulto") } else { print("Menor") } ``` ### if-else if-else ```r puntuacion <- 85 calificacion <- if(puntuacion >= 90) { "A" } else if (puntuacion >= 80) { "B" } else if (puntuacion >= 70) { "C" } else if (puntuacion >= 60) { "D" } else { "F" } print(calificacion) # "B" ``` ### ifelse en línea ```r # Versión de una sola línea edad <- 20 estado <- if(edad >= 18) "adulto" else "menor" ``` ## Función ifelse ### Condición Vectorizada ```r # ifelse para vectores x <- 1:10 resultado <- ifelse(x > 5, "grande", "pequeño") # "pequeño" "pequeño" "pequeño" "pequeño" "pequeño" "grande" "grande" "grande" "grande" "grande" # Múltiples condiciones puntuacion <- 75 calificacion <- ifelse(puntuacion >= 90, "A", ifelse(puntuacion >= 80, "B", ifelse(puntuacion >= 70, "C", ifelse(puntuacion >= 60, "D", "F")))) ``` ### con Manejo de NA ```r x <- c(1, 2, NA, 4, 5) ifelse(x > 2, "grande", "pequeño") # "pequeño" "pequeño" NA "grande" "grande" # Con reemplazo de NA ifelse(is.na(x), 0, x) # 1 2 0 4 5 ``` ## Declaración switch ### switch Básico ```r # Por posición dia <- 2 nombre_dia <- switch(dia, "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo" ) print(nombre_dia) # "Martes" ``` ### Por Nombre ```r # Por nombre (más legible) color <- "rojo" resultado <- switch(color, "rojo" = "Parar", "amarillo" = "Reducir velocidad", "verde" = "Avanzar" ) print(resultado) # "Parar" ``` ### Con Valor por Defecto ```r # Sin coincidencia retorna NULL o último valor resultado <- switch("morado", "rojo" = "Parar", "verde" = "Avanzar" ) print(resultado) # NULL # Usa valor por defecto como último valor resultado <- switch("morado", "rojo" = "Parar", "verde" = "Avanzar", "Color desconocido" ) print(resultado) # "Color desconocido" ``` ## Bucle for ### for Básico ```r # Bucle a través de secuencia for (i in 1:5) { print(i) } # 1, 2, 3, 4, 5 ``` ### Iterar sobre Vectores ```r # Bucle a través de vector frutas <- c("manzana", "plátano", "cereza") for (fruta in frutas) { print(fruta) } # Usando índice for (i in seq_along(frutas)) { print(paste(i, frutas[i])) } ``` ### for Anidado ```r # Tabla de multiplicar for (i in 1:3) { for (j in 1:3) { cat(i, "x", j, "=", i * j, "\n") } } ``` ## Bucle while ### while Básico ```r i <- 1 while (i <= 5) { print(i) i <- i + 1 } # 1, 2, 3, 4, 5 ``` ### while con Condición ```r # Leer entrada hasta que sea válida valor <- 0 while (valor <= 0 || valor > 100) { valor <- as.numeric(readline(prompt = "Ingresa 1-100: ")) } ``` ## Bucle repeat ### Bucle Infinito con break ```r # repeat es bucle infinito (como while TRUE) repeat { print("Esto se ejecuta una vez") break # Debe tener condición de salida } ``` ### repeat para Menú ```r repeat { cat("1. Nuevo Juego\n") cat("2. Cargar Juego\n") cat("3. Salir\n") opcion <- as.integer(readline(prompt = "Elige: ")) if (opcion == 3) { print("¡Adiós!") break } else if (opcion == 1) { print("Iniciando nuevo juego...") break } } ``` ## break y next ### break - Salir del Bucle ```r # Encontrar primer número par numeros <- c(1, 3, 5, 6, 7, 8) for (num in numeros) { if (num %% 2 == 0) { print(paste("Primer par:", num)) break } } ``` ### next - Saltar Iteración ```r # Saltar números pares for (i in 1:5) { if (i %% 2 == 0) { next # Saltar a la siguiente iteración } print(i) } # 1, 3, 5 ``` ## Familia apply ### lapply - Apply de Lista ```r # lapply retorna una lista nums <- list(a = 1:3, b = 4:6) resultado <- lapply(nums, mean) # $a: 2 # $b: 5 # Función anónima resultado <- lapply(nums, function(x) x * 2) ``` ### sapply - Apply Simplificado ```r # sapply simplifica a vector si es posible nums <- list(a = 1:3, b = 4:6) resultado <- sapply(nums, mean) # a b # 2 5 # Modo vector resultado <- sapply(1:3, function(x) x^2) # 1 4 9 ``` ### apply - Apply de Array/Matriz ```r mat <- matrix(1:9, nrow = 3) # Aplicar función a filas (1) o columnas (2) apply(mat, 1, sum) # Sumas de filas apply(mat, 2, mean) # Medias de columnas ``` ### vapply - Apply con Tipo Predefinido ```r # vapply es más rápido y seguro nums <- list(a = 1:3, b = 4:6) resultado <- vapply(nums, mean, numeric(1)) # a b # 2 5 ``` ### tapply - Apply de Tabla ```r # Aplicar función por grupos puntuaciones <- c(85, 90, 75, 95, 80) grupos <- c("A", "A", "B", "B", "A") tapply(puntuaciones, grupos, mean) # A B # 85 85 ``` ### mapply - Apply de Múltiples Argumentos ```r # Aplicar función a múltiples vectores mapply(sum, 1:3, 10:12, 20:22) # 31 34 37 # Igual que sum(1, 10, 20), sum(2, 11, 21), sum(3, 12, 22) ``` ## Patrones Comunes ### Sumar 1 a N ```r # Vectorizado (rápido) sum(1:100) # Versión con bucle total <- 0 for (i in 1:100) { total <- total + i } ``` ### Encontrar en Vector ```r numeros <- c(3, 7, 2, 9, 4) objetivo <- 9 for (num in numeros) { if (num == objetivo) { print("¡Encontrado!") break } } ``` ### Contar Coincidencias ```r numeros <- c(1, 2, 3, 2, 4, 2, 5) objetivo <- 2 conteo <- 0 for (num in numeros) { if (num == objetivo) { conteo <- conteo + 1 } } print(conteo) # 3 ``` ## Resumen - if/else if/else para lógica condicional - ifelse() para condicionales vectorizados - switch() para coincidencia de valores discretos - Bucle for para iteraciones conocidas - Bucle while para iteración basada en condiciones - repeat para bucles infinitos con break - next salta iteración, break sale del bucle - Familia apply: lapply, sapply, apply, vapply, tapply, mapply

Comments

Comments powered by Giscus

To enable comments, add your Giscus embed code here.

Learn more about Giscus →