Bucles (loops) y condicionales en R

¿Qué son los bucles (loops)?

Los bucles o loops son una declaración (statement) que se ejecuta de forma iterativa sobre una secuencia de items. Así, en lugar de repetir líneas de código para cada item de la secuencia, el bucle realiza una ejecución automática sobre todos los items hasta que se satisface la totalidad.

Bucle for

for(i in 1:20){
  print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11
## [1] 12
## [1] 13
## [1] 14
## [1] 15
## [1] 16
## [1] 17
## [1] 18
## [1] 19
## [1] 20
for(i in 1:20){
  y = i+1
  print(y)
}
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11
## [1] 12
## [1] 13
## [1] 14
## [1] 15
## [1] 16
## [1] 17
## [1] 18
## [1] 19
## [1] 20
## [1] 21
x <- c(3,4,5,6,7,8,9,10,20)
for(i in x){
  y = sqrt(i)
  print(y)
}
## [1] 1.732051
## [1] 2
## [1] 2.236068
## [1] 2.44949
## [1] 2.645751
## [1] 2.828427
## [1] 3
## [1] 3.162278
## [1] 4.472136
año <- c('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto',
         'Septiembre','Octubre','Noviembre','Diciembre')
for(mes in año){
  print(mes)
}
## [1] "Enero"
## [1] "Febrero"
## [1] "Marzo"
## [1] "Abril"
## [1] "Mayo"
## [1] "Junio"
## [1] "Julio"
## [1] "Agosto"
## [1] "Septiembre"
## [1] "Octubre"
## [1] "Noviembre"
## [1] "Diciembre"

Bucle for para una lista

mi_lista <- c('banana','manzana','lechosa','naranja','piña')
for(i in seq_along(mi_lista)){
  alimento <- mi_lista[[i]]
  print(paste('El alimento de mi lista de compra es:', alimento))
}
## [1] "El alimento de mi lista de compra es: banana"
## [1] "El alimento de mi lista de compra es: manzana"
## [1] "El alimento de mi lista de compra es: lechosa"
## [1] "El alimento de mi lista de compra es: naranja"
## [1] "El alimento de mi lista de compra es: piña"

Bucle for para una tabla de datos (dataframe)

df <- data.frame(
  nombre = c('María','José','Linda','Rafael'),
  Edad = c(24,27,23,29),
  Sexo = c('F','M','F','M')) 
print(df) 
##   nombre Edad Sexo
## 1  María   24    F
## 2   José   27    M
## 3  Linda   23    F
## 4 Rafael   29    M
for(i in seq_len(nrow(df))){
  sujeto <- df[i, ]
  print(paste('El sujeto seleccionado es:', toString(sujeto))) 
}
## [1] "El sujeto seleccionado es: María, 24, F"
## [1] "El sujeto seleccionado es: José, 27, M"
## [1] "El sujeto seleccionado es: Linda, 23, F"
## [1] "El sujeto seleccionado es: Rafael, 29, M"

Bucle while

Este tipo de bucle se utiliza para repetir una instrucción hasta que se satisfaga cierta condición, momento en el cual el proceso automático se detiene.

i <- 2
while(i < 10){
  i = i + 2
  print(i)
}
## [1] 4
## [1] 6
## [1] 8
## [1] 10

Declaración break

La introducción de la declaración break, hace que un bucle while finalice, aun cuando no se satisfaga la condición inicial. Tomemos el ejemplo anterior:

i <- 2
while(i < 10){
  print(i) 
  i = i + 2
  if(i == 6){
    break
  }
}
## [1] 2
## [1] 4

Bucle repeat

En este caso es más importante que nunca la declaración break, ya que de lo contrario, el bucle seguirá iterando infinitamente.

i <- 0
repeat{
  print(i)
  i <- i + 1
  if(i == 10){
    break
  }
}
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
print('El proceso ha finalizado')
## [1] "El proceso ha finalizado"
i <- 0
repeat{
  print('¡Hola mundo!')
  i <- i + 1
  if(i == 7){
    break
  }
}
## [1] "¡Hola mundo!"
## [1] "¡Hola mundo!"
## [1] "¡Hola mundo!"
## [1] "¡Hola mundo!"
## [1] "¡Hola mundo!"
## [1] "¡Hola mundo!"
## [1] "¡Hola mundo!"

Condicionales if, else

Generalmente se utiliza el condicional, para la toma de decisiones. Veamos algunos ejemplos

a <- 57
b <- 89

if(a < b)
{
  print('Si a < b, la diferencia (a - b) es un número negativo')
  resta <- a - b
  print(paste('La diferencia es:', resta ))
} else{
  resta <- a - b
  print('Si a > b, la diferencia (a - b) es un número positivo')
  print(paste('La diferencia es:', resta))
}
## [1] "Si a < b, la diferencia (a - b) es un número negativo"
## [1] "La diferencia es: -32"

Programando una calculadora de índice de masa corporal (IMC)

peso_kg <- 70
talla_metros <- 1.72

IMC <- peso_kg/(talla_metros)**2
print(paste('Su índice de masa corporal es:', IMC))
## [1] "Su índice de masa corporal es: 23.6614386154678"
if(IMC < 18)
{
  print('Usted tiene muy bajo peso para su talla')
} else if (IMC >= 18 & IMC <= 24.9){
  print('Su peso es adecuado para su talla')
} else if (IMC >= 25 & IMC <= 29.9){
  print('Usted tiene sobrepeso')
} else{
  print('Usted tiene obesidad')
}
## [1] "Su peso es adecuado para su talla"