Age Validator y Tip Calculator
Aprende más sobre estructuras de control revisando lo
siguiente.
Las estructuras de control sirven para controlar el flujo de un
algoritmo. Las podemos agrupar en:
Para más información puedes revisar la documentación
?Control.
Los bloques de código se delimitan con corchetes
{ }, de la misma manera que con las funciones
personalizadas que vimos anteriormente. Aquí un resumen de los tres
tipos de paréntesis en R:
1. ( ): función( argumentos )
2. [ ]: objeto[ subconjunto ]
3. { }: { bloque de código }
If
Observa los siguientes ejemplos de if,
if-else y nested-ifs (ifs
anidados).
Incluyo un valor default aquí para age pero te
recomiendo que pruebes con diferentes valores para intentar obtener los
diferentes mensajes posibles.
Seteamos el working directory y limpiamos la
consola de variables
age <- 21
if (age < 18) {
print("Milk for you!")
}
if(age >= 18) {
print("Beer for you!")
}
## [1] "Beer for you!"
if (age < 18) {
print("Milk for you!")
} else {
print("Beer for you!")
}
## [1] "Beer for you!"
if (age < 18) {
print("Milk for you!")
} else if (age > 75) {
print("Water for you!")
} else {
print("Beer for you!")
}
## [1] "Beer for you!"
Ahora haremos una función personalizada (“custom
function”) que pida la edad al usuario y otorgue una respuesta
en cuanto a la bebida que puede consumir.
trago <- function() {
edad <- readline("Edad? ")
if (edad < 18) {
print("You need milk!")
}
else if (edad > 75) {
print("You need water!")
}
else {
print("You have beer!")
}
}
#trago()
hi <- function() {
nombre <- readline("Nombre? ")
print(paste0("Hola ", nombre, "!"))
}
Nota cómo en este caso la función la tenemos que mandar llamar sin
argumentos, dado que la edad, que es lo único que ocupa para tomar la
decisión, la pregunta al usuario directamente. Haz tus propias
pruebas:
Mini-reto: Propina total
Intenta hacer este código por tu cuenta, antes de ver el
resultado.
Queremos una función para utilizar al asistir a un
restaurant como parte de un grupo. Esta función debe calcular la
propina total a pagar tomando en cuenta dos datos:
cuenta y personas. Si las personas en la mesa fueron
menos de 10, entonces la propina será el 10% de
la cuenta, de lo contrario, será el
15%.
calculo_propina = function(cuenta, n_personas) {
calculo_propina.cuenta = as.double(cuenta)
calculo_propina.n_personas = as.integer(n_personas)
if (calculo_propina.n_personas < 10) {
propina = 0.1 * calculo_propina.cuenta
} else {
propina = 0.15 * calculo_propina.cuenta
}
print(paste0("La propina es ", "S/. ", propina))
}
propina = calculo_propina(557.20, 20)
## [1] "La propina es S/. 83.58"
Ya vimos en un ejemplo anterior la función
ifelse(), que es parecida al IF de
Excel. De igual manera, la estructura selectiva
if-else es similar. Se revisa una condición y en base a
ella se ejecuta una cosa o la otra. Sin embargo, la función
ifelse() es más compacta y solo puede tener una
instrucción, en vez de bloques de código completos que pueden
contener incluso otras estructuras de control, como es
el caso de un if-else como estructura selectiva.
Mientras que las instrucciones a ejecutar son los
argumentos de ifelse() y van entre sus
paréntesis (), en el caso de un
if-else los bloques de código van entre
corchetes, { }. Mientras que if-else es más
general y tiene muchos usos, el uso de
ifelse() tiende a ser más acotado,
típicamente es el de reemplazar valores de un vector por uno u otro, en
base a una condición.
Switch
La estructura selectiva switch-case es similar a
utilizar nested-ifs, en otras palabras, es muy útil
cuando la decisión a tomar tiene más de dos posibilidades, pero es más
compacta que encadenar varios ifs.
Aunque algunos otros lenguajes tienen estructuras de control
switch-case que permiten tener bloques de código para
cada caso, en R base solo está la función switch(), por
lo cual su uso está más limitado.
Aunque es una función y no una estructura
de control, la explicaré aquí para redondear el tema.
La función switch() revisa una variable y en base a
su tipo de dato puede tener uno de dos comportamientos: * Si el
valor es numérico, regresará como resultado el
valor que tenga en dicha posición. * Si el
valor es de texto, regresará como resultado el
valor que tenga ese texto como etiqueta.
Aquí dos ejemplos con los que puedes probar:
number <- 1
switch(number,
"Love",
"Money",
"Power")
## [1] "Love"
option <- "b"
switch(option,
"a" = "Love",
"b" = "Money",
"c" = "Power")
## [1] "Money"