# if (expr1) expr2 else expr3
# si (ocurre esta condicion) ejecuta estos comandos (si no) ejecuta estos otrosExisten 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:
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 comandosPor 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 comandosPor 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