Estructuras de control¶
Las estructuras de control nos permiten crear programas con múltiples caminos posibles a seguir, dependiendo de ciertas condiciones a comprobar. Veamos qué estructuras tenemos disponibles en R.
1. Estructuras selectivas¶
R dispone de las típicas estructuras selectivas de otros lenguajes.
1.1. La estructura if/else¶
Por un lado, tenemos la estructura if e if..else para poder decidir entre uno o varios caminos, según la condición que se cumpla:
if(condicion1)
{
# Codigo
} else if(condicion2) {
# Codigo
} else {
# Codigo
}
Importante
Es IMPORTANTE la colocación de las llaves de apertura y cierre en la misma línea que el siguiente else, ya que de lo contrario podemos obtener un error de sintaxis.
1.2. La estructura switch/case¶
Alternativamente, también disponemos de la estructura switch/case, aunque con una sintaxis diferente a lo habitual. Comenzaremos con la partícula switch
indicando, entre paréntesis, el valor que queremos evaluar, y cada una de las acciones a realizar en cada posible caso. Veamos algunos ejemplos:
# Asignamos a la variable s un texto según el valor
# del primer parámetro
s <- switch(
4,
"Uno",
"Dos",
"Tres",
"Cuatro",
"Cinco"
)
# s valdrá "Cuatro"
# Hacemos una acción u otra según cuánto vale texto
texto = "p"
switch(
texto,
"a" = cat("Vale a"),
"b" = cat("Vale b"),
"p" = cat("Vale p"),
"z" = cat("Vale z")
)
# Se mostrará "Vale p"
2. Estructuras repetitivas o bucles¶
R dispone de tres tipos de bucles que podemos utilizar:
2.1. El bucle repeat¶
El bucle repeat
permite repetir un conjunto de instrucciones, y terminar cuando se cumpla una determinada condición
repeat
{
# Instrucciones
if(condicion)
{
break
}
}
Ejemplo:
# Contador del 1 al 10
n <- 1
repeat
{
print(n)
n <- n+1
if(n > 10)
{
break;
}
}
2.2. El bucle while¶
Similar a otros lenguajes, ejecuta un conjunto de instrucciones mientras se cumpla una determinada condición. El ejemplo anterior podría quedar así:
n <- 1
while(n <= 10)
{
print(n)
n <- n+1
}
2.3. El bucle for¶
El bucle for se emplea para recorrer todas las opciones de una lista de valores:
for(n in 1:10)
{
print(n)
}
datos <- c("uno", "dos", "tres")
for(x in datos)
{
print(x)
}
Ejercicio 1
Crea un programa mediaNotas.r
que le pida al usuario una secuencia de 10 notas numéricas. Deberá indicar al final la nota nominal (SOBRESALIENTE, NOTABLE, APROBADO, SUSPENSO) dependiendo de la media de esas 10 notas
Solución Ejercicio 1
Aquí puedes ver un vídeo con la solución paso a paso del ejercicio
3. Gestión de excepciones¶
Al igual que ocurre en otros lenguajes como Java o Python, en R pueden producirse errores durante la ejecución de un programa, y las excepciones son un mecanismo que nos permite controlar estos errores, mostrar un mensaje apropiado y continuar con la ejecución.
Para ello disponemos, entre otras opciones, de la función tryCatch
, que recibe como parámetro el bloque de código que se debe ejecutar con normalidad. Adicionalmente, se le pasan unos parámetros error
, warning
y/o message
con el código a ejecutar dependiendo del tipo de error que se haya producido.
El siguiente ejemplo trata de obtener la raíz cuadrada de lo que diga el usuario. Si no puede se ejecutará el segundo bloque de código para mostrar un error:
tryCatch({
cat("Escribe un número:")
valor <- sqrt(as.integer(readLines("stdin", n=1)))
print(valor)
}, error = function(e) {
cat("Se ha producido un error:", conditionMessage(e), "\n")
}, warning = function(w) {
cat("Advertencia:", conditionMessage(w), "\n")
}, message = function(w) {
cat("Mensaje:", conditionMessage(w), "\n")
}, finally = {
cat("Finalizando tryCatch\n")
})
Como decimos, en función del error producido se ejecutará uno de los parámetros (error, warning o message), y con la función conditionMessage
podemos mostrar el mensaje de error en cuestión. El bloque finally
podemos emplearlo para lo que queramos que se ejecute al finalizar la ejecución del bloque, haya sido exitosa o no.