Bucles

Ejecución repetitiva de comandos.
if
for
repeat
while
print
cat
message
warning
is.numeric
is.character
paste
break
proc.time
Author

Román Salmerón Gómez

Published

November 24, 2022

Existen situaciones donde es necesario ejecutar una serie de comandos de forma repetitiva para un conjunto concreto o mientras que se verifica una condición.

En tal caso resultan interesante trabajar con los comandos if o for. Otras construcciones repetitivas a tener en cuenta son repeat y while.

if, construcción condicional

La estructura de este comando es la siguiente:

# if (expr1) expr2 else expr3
# si (ocurre esta condicion) ejecuta estos comandos (si no) ejecuta estos otros

Por ejemplo:

a = 2

if (a==2){ 
  print("Hola a todos") # escribe en pantalla un mensaje
  a = 3
} else {
  print("Hola solo a unos pocos")
  a = -3
}
[1] "Hola a todos"
a 
[1] 3
if (a==2){ 
  print("Hola a todos") 
  a = 3
} else {
  print("Hola solo a unos pocos")
  a = -3
}
[1] "Hola solo a unos pocos"
a 
[1] -3

En lugar de print se podría usar también cat, message o warning:

b = 5
if (is.numeric(b)==TRUE) {
    b = "canario"
    cat("Hello world!!!") # escribe en pantalla un mensaje
} else b = "gato"
Hello world!!!
b 
[1] "canario"
if (is.numeric(b)==TRUE) {
    b = "perro" 
} else {
    b = "gato"
    message("Hi world!!!") # escribe en pantalla un mensaje
}
Hi world!!!
b
[1] "gato"

¿Qué hace el comando is.numeric?

Cuando las expresiones a ejecutar es un único comando, no es necesario el uso de las llaves. Así, un ejemplo en una sola línea podría ser:

if (is.character(a)==TRUE) a = "perro" else a = "gato"
a 
[1] "gato"
if (is.character(a)==TRUE) a = "perro" else a = "gato"
a
[1] "perro"

Consultar help(is.character).

En este caso la formulación ifelse es más cómoda:

# ifelse(test, yes, no)
a = ifelse(is.character(a)==FALSE, "perro", 3)
a 
[1] 3
a = ifelse(is.character(a)==FALSE, "perro", 3)
a
[1] "perro"

for, construcción repetitiva

La estructura de este comando es la siguiente:

# for (nombre in expr 1) expr 2
# para (los valores que pertenecen a cierto conjunto) ejecuta una serie de comandos

Por ejemplo:

for (i in 1:3) print(i)
[1] 1
[1] 2
[1] 3
for (i in 1:3) warning(paste("Iteracion", i)) # ¿qué hace el comando 'paste'?
Warning: Iteracion 1
Warning: Iteracion 2
Warning: Iteracion 3

Otra posibilidad es generar los datos de una función:

x = numeric() 
orden = -20:20
j = 1
for (i in orden){
  x[j] = i^2 # genero la función f(x) = x^2 con x=-20,-19,...,19,20
  j = j + 1
} 
x
 [1] 400 361 324 289 256 225 196 169 144 121 100  81  64  49  36  25  16   9   4
[20]   1   0   1   4   9  16  25  36  49  64  81 100 121 144 169 196 225 256 289
[39] 324 361 400

Los datos se pueden representar mediante el comando plot:

plot(orden, x, type="b", col="purple", lwd=3, xlab="x", ylab="y=x^2")

while, construcción repetitiva

La estructura de este comando es la siguiente:

# while (expr1) expr2
# mientras (que la condición especificada sea cierta) ejecuta una serie de comandos

Por ejemplo:

j = 1
while (j < 10) {
  cat(j) # probar con cat(j, "\n")
  j = j + 1
}
123456789

Es evidente que se pueden anidar distintas estructuras repetitivas. En este caso se anidan para parar la repetición:

j = 1
while (j > 0) {
  cat(j, "\n")
  j = j + 1
  if (j == 3) {
    message("Hemos llegado al tope de iteraciones")
    break 
  }
}
1 
2 
Hemos llegado al tope de iteraciones

Por último, una curiosidad. Medir tiempo de ejecución de un bucle:

t0 <- proc.time()
j = 1
while (j > 0) {
  j = j + 1
  if (j == 300000) break
}
proc.time() - t0 # la tercera salida es el tiempo "real" transcurrido desde que se inició el proceso
   user  system elapsed 
   0.02    0.00    0.01