# if (expr1) expr2 else expr3
# si (ocurre esta condicion) ejecuta estos comandos (si no) ejecuta estos otros
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:
Por ejemplo:
= 2
a
if (a==2){
print("Hola a todos") # escribe en pantalla un mensaje
= 3
a else {
} print("Hola solo a unos pocos")
= -3
a }
[1] "Hola a todos"
a
[1] 3
if (a==2){
print("Hola a todos")
= 3
a else {
} print("Hola solo a unos pocos")
= -3
a }
[1] "Hola solo a unos pocos"
a
[1] -3
En lugar de print se podría usar también cat, message o warning:
= 5
b if (is.numeric(b)==TRUE) {
= "canario"
b cat("Hello world!!!") # escribe en pantalla un mensaje
else b = "gato" }
Hello world!!!
b
[1] "canario"
if (is.numeric(b)==TRUE) {
= "perro"
b else {
} = "gato"
b 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)
= ifelse(is.character(a)==FALSE, "perro", 3)
a a
[1] 3
= ifelse(is.character(a)==FALSE, "perro", 3)
a 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:
= numeric()
x = -20:20
orden = 1
j for (i in orden){
= i^2 # genero la función f(x) = x^2 con x=-20,-19,...,19,20
x[j] = j + 1
j
} 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:
= 1
j while (j < 10) {
cat(j) # probar con cat(j, "\n")
= j + 1
j }
123456789
Es evidente que se pueden anidar distintas estructuras repetitivas. En este caso se anidan para parar la repetición:
= 1
j while (j > 0) {
cat(j, "\n")
= j + 1
j 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:
<- proc.time()
t0 = 1
j while (j > 0) {
= j + 1
j 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