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 →