Chapter 6 Estructuras de selección

  1. if
  2. ifelse
  3. ifelse
  4. if ... else if ...else if ...else

6.1 If (si condicional)

La instrucción if nos permite probar una condición y esa condición debe arrojar un valor booleano, es decir, un valor de verdad (TRUE o FALSE) Si la condición es verdadera se ejecuta lo que está dentro de los corchetes, de lo contrario, ejecuta lo que sigue después del corchete de cierre.

Definición: Lo que se encuentra dentra del corchete se llama cuerpo ( body ) de la declaración if

Diagrama de flujo del If
Diagrama de flujo del If

La sintaxis de una condición if consiste en lo siguiente:

if (condicion){

si la condicion es verdadera

Ejecuta TODO lo que está en los corchetes

}

6.1.1 Sintaxis

if(<condition>) {
        ## Hace algo
} 
## Continúa con el resto del código

6.1.2 Errores comunes en el if

  1. No incializar la variable de la condición.
  2. La condición no arroja un valor de verdad.
  3. No poner todo lo que quieres que haga dentro de los corchetes.
  4. Este no es un error, es más bien una advertencia, si la condición arroja un sólo valor de verdad sólo toma en cuenta el primero de ellos.

###Ejemplos de uso del if

mayor_de_edad<-18

edad<-20

if(edad >=mayor_de_edad){
  print("Eres mayor de edad")
}
## [1] "Eres mayor de edad"
x<-5+4
print(x)
## [1] 9
minimo<-20000
dinero<-15000

if(dinero>=minimo){
  print("¿Cómo está Cancún?")
  print("La vida es buena")
  sobrante<-dinero-minimo
  print(paste("Me queda $", sobrante))
}
print("Acá sigue")
## [1] "Acá sigue"

6.1.2.1 Ejercicios

  1. Elabora un programa que compare tu estatura con tu ídolx y determine si eres más altx.
  2. Toma dos archivos fasta de virus distintos. Leelos con Biostrings y compara sus tamaños ( en bp) y determina si el primero es más grande que el segundo.
  3. A partir del archivo de anotación del genoma de un organismo determina toma dos proteínas al azar y compara sus tamaños. Toma todos los genes de la cadena positiva y todos los de la negativa compara sus tamaños promedio y determina cuál de estos es más grande.

6.2 Combinación de operadores booleanos

Los operadores lógicos o booleanos se pueden combinar para formar enunciados complejos por ejemplo:

  1. Tengo vacaciones (del trabajo y/o la escuela)
  2. Tengo dinero

Si las dos condiciones son ciertas entonces puedo hacer algo

También podría ser que basta con que una de ellas sea cierta para que haga algo.

6.2.1 And (&)

El operador booleano & representa el “Y” lógico. Estos operadores binarios nos sirven para unir al menos dos enunciados que tienen valor de verdadero o falso (Tengo dinero (V/F), Tengo vacaciones (V/F))

Con estas dos operaciones puedo unirlas utilizando el operador “Y” lógico (AND (&)) representado en R con el símbolo del ampersand (&)

Tengo dinero AND Tengo vaciones

Para saber el valor booleano (V/F) del enunciado anterior debemos conocer los valores de verdad de los enunciados por separado

Por ejemplo, podemos representar al primer enunciado por p y al segundo enunciado por q

p: Tengo dinero

q: Tengo vacaciones

Para saber cuál es el valor de verdad del enunciado compuesto debemos ver cuáles son todas las combinaciones de valores de verdad de los enunciados que la componen: p verdadero y q verdadero, p verdadero y q falso, p falso y q verdadero, p falso y q falso. Eso se resumen en las tablas de verdad de los operadores

Tabla de verdad del AND
p q p & q
V V V
V F F
F V F
F F F

Es decir, el & solo es verdadero cuando ambas condiciones son verdaderas.

Esto representa lo que se observa en la realidad: es decir, solo hago algo si tengo y tengo vacaciones. Si una de ellas no se cumple (es decir, es falsa) entonces no se lleva a cabo la acción.

6.2.2 OR (|)

El operador booleano | representa el “O” lógico. Estos operadores binarios nos sirven para unir al menos dos enunciados que tienen valor de verdadero o falso (Tengo dinero (V/F), Tengo vacaciones (V/F))

Con estas dos operaciones puedo unirlas utilizando el operador O lógico (OR (|)) representado en R con el símbolo de la barrita (|)

Tengo dinero OR Tengo vaciones

Para saber el valor booleano (V/F) del enunciado anterior debemos conocer los valores de verdad de los enunciados por separado

Por ejemplo podemos representar al primer enunciado por p y al segundo enunciado por q

p: Tengo dinero

q: Tengo vacaciones

Para saber cuál es el valor de verdad del enunciado compuesto debemos ver cuáles son todas las combinaciones de valores de verdad de los enunciados que la componen: p verdadero y q verdadero, p verdadero y q falso, p falso y q verdadero, p falso y q falso. Eso se resumen en las tablas de verdad de los operadores

Tabla de verdad del operador OR
p q p | q
V V V
V F V
F V V
F F F

Es decir haría algo, por ejemplo, irme a la playa cuando al menos una condición se cumpla. Por ejemplo que tenga dinero aunque no tenga vacaciones, que tenga vacaciones aunque no tenga dinero y, obviamente, también cuando las dos se cumplen.

Es decir, el | solo es falso cuando ambas condiciones son falsas.

6.2.3 Ejemplos de combinaciones

Por ejemplo es útil para intervalos

\[ 18 \leq edad \leq 29 \]

Esta condición la podemos expresar mediante la combinación de dos: la edad debe ser mayor igual a 18 y (AND, &) la edad debe ser menor o igual que 29

if (edad >= 18 & edad <=29){
  print("Te toca vacunarte")
}
## [1] "Te toca vacunarte"

Pregunta: ¿qué pasaría si se pone un OR como unión entre las dos condiciones

if (edad >= 18 | edad <=29){
  print("Te toca vacunarte")
}
## [1] "Te toca vacunarte"

o así (¿es lo mismo?)

if (edad <= 29 | edad >= 18){
  print("Te toca vacunarte")
}
## [1] "Te toca vacunarte"

6.3 Ejercicio

  1. ¿Cómo harías una condición que considere que te gusta el mole y el pozole?

  2. ¿Cómo harías una condición que considere que te gusta el mole o el pozole?

6.4 If … else (si … de otro modo)

Si además quieres que se ejecute algo cuando la condición es falsa entonces debes usar la declaración if … else

if (condición) { # Si la condición es cierta
hace esto
y esto
y esto
} else { # De otro modo, es decir si es falsa hace lo que #está en el corchete
entonces hace esto otro
y esto otro
y esto
}
Diagrama_if_else
Diagrama_if_else
minimo<-20000
vacaciones<-"SI"
dinero<-21000
if(dinero>=minimo & vacaciones=="SI"){
  print("Me voy a la playa, loser")
}else{
  print("Me quedo en mi casa")
}
## [1] "Me voy a la playa, loser"

6.5 ifelse

Si la condición es muy simple ,tanto para cuando es verdadero como cuando es falso se puede implementar la función ifelse en una línea. Es equivalente a la condición compuesta pero ahorramos código.

edad<-21
ifelse(edad>=18, "Ya eres grande","Todavia no puedes beber (legalmente)")
## [1] "Ya eres grande"
edad<-12
ifelse(edad>=18, "Ya eres grande","Todavia no puedes beber (legalmente)")
## [1] "Todavia no puedes beber (legalmente)"

6.6 If … else if … else ( si, si no si , si no si, si no)

Si tienes más opciones, es decir no alternativas, puedes usar la sentencia if … else if …else if …else

Importante

Esta estructura se ejecuta solo en la primera que sea verdadera o si no hay una verdadera ejecuta lo que esta en el else

if ( condicion 1) {
Hace cosas
} else if ( condcion 2) {
Hace otras cosas
} else if ( condicion 3) {
Hace estas otras cosas
} else {
No le queda de otra y hace esto
}
Diagrama de flujo del if… else if… else if…else
Diagrama de flujo del if… else if… else if…else
numero<-3
if(numero > 0){
  print("Tu número es positivo")
}else if (numero <0){
  print("Tu número es negativo")
}else{
  print("Tu número es cero")
}
## [1] "Tu número es positivo"
numero<- -27
if(numero > 0){
  print("Tu número es positivo")
}else if (numero <0){
  print("Tu número es negativo")
}else{
  print("Tu número es cero")
}
## [1] "Tu número es negativo"
numero<- 0
if(numero > 0){
  print("Tu número es positivo")
}else if (numero <0){
  print("Tu número es negativo")
}else{
  print("Tu número es cero")
}
## [1] "Tu número es cero"

Pregunta: ¿por qué no es necesario poner un if en el último else?

6.7 Ejercicios

  1. Elabora un programa que con tu fecha de cumpleaños te diga en qué estación del año naciste.

  2. Elabora un programa que a partir de las calificaciones de tus examenes parciales y 8 quincenales arroje si exentarás o no este curso usando los criterios definidos en el programa del curso. Asume que en las tareas y demás actividades tienes 10.

  3. Dado un valor de pH de una muestra, escribe un código en R que determine si el ambiente es ácido (\(pH < 7\)) o neutro (\(pH = 7\)).

  4. Dada una temperatura determina si es adeucada para el crecimiento de una bacteria mesófila. La temperatura óptima para los mesófilos está entre 20°C y 45°C.

  5. Clasifica una célula entre procariota o eucariota basándote en su tamaño. Si la célula mide menos de 10 micrómetros, es procariota; de lo contrario, es eucariota.

  6. Dado un porcentaje de contenido de guanina y citosina (GC) de cepas de E coli, escribe un código que determine si el ADN es rico en GC (más del 50%).

  7. Escribe un código que determine si un hongo es potencialmente patógeno. Un hongo que crece óptimamente a 37°C es considerado patógeno.

  8. Una cepa bacteriana ha sido sometida a un test de sensibilidad a antibióticos. Si la zona de inhibición es mayor o igual a 15 mm, clasifícala como sensible; de lo contrario, clasifícala como resistente.

  9. Dado un nivel de anticuerpos, escribe un código que determine si un individuo es inmune (niveles superiores a 500) o susceptible a una infección.

  10. Un hongo dimórfico cambia de forma según la temperatura. A 25°C, adopta una forma micelial, y a 37°C, forma levaduriforme. Escribe un código que clasifique la forma del hongo según la temperatura de incubación.

  11. Clasifica un ambiente acuático según la concentración de oxígeno disuelto: oxigenado (> 8 mg/L), moderado en oxígeno (4-8 mg/L) o anóxico (< 4 mg/L).

  12. Escribe un código que determine si un paciente debe recibir tratamiento antibiótico en función de su conteo de leucocitos. Un conteo superior a 10,000 indica que requiere tratamiento.

  13. Dada una cepa bacteriana, verifica si fermenta lactosa basándote en el resultado de un ensayo de fermentación (valor TRUE o FALSE).

  14. Dado un paciente con una temperatura corporal de 38.5°C, escribe un código que determine si tiene fiebre (temperatura > 37.5°C).

  15. En un cultivo de levaduras, la fase de crecimiento puede ser “latencia”, “exponencial” o “estacionaria”. Escribe un código que clasifique la fase en que se encuentra la levadura.

  16. Durante un ensayo de tinción de Gram, una bacteria se tiñe de color violeta. Escribe un código que determine si la bacteria es gram positiva o gram negativa según la coloración obtenida.

  17. Dado un paciente, escribe un código que determine si tiene una infección viral o bacteriana basándote en los niveles de linfocitos (> 4000 sugiere infección viral) y neutrófilos (> 7000 sugiere infección bacteriana).