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:

Estructuras_Selectivas

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"