2.3. Controles del Flujo

Las expresiones de control (control statements) son expresiones que se utilizan para controlar la ejecución y el flujo del programa según las condiciones proporcionadas en las expresiones. Estas estructuras se utilizan para tomar una decisión después de evaluar la variable.

2.3.1 Las expresiones con if…else

Al finalizar esta sección podrás utilizar la expresión if…else para determinar la ruta en la aplicación de un código

La expresión if

La sintaxis de esta expresión es:

if(prueba o condición) {
expresión de control o acción
}


A continuación, un ejemplo del uso de if:

# dato a probar
nx <- 7
# probar si el número es positivo
if(nx > 0){
print("Número Positivo")
}
## [1] "Número Positivo"

nx puede ser el resultado de un cálculo anterior y con el if se le hace una prueba.

La expresión if…else

En este caso la sintaxis de esta expresión es:

if(prueba o condición){
expresión de control o acción si se cumple la condición
} else {
expresión de control o acción si no se cumple la condición
}

Ejemplo del uso de if…else:

# dato a probar
nx <- -7
# probar si el número es positivo o negativo
if(nx > 0){
print("Número Positivo")
} else {
  print("Número Negativo")
}
## [1] "Número Negativo"

Uso combinado de if…else con una función

El resultado de aplicar una función puede condicionarse a la evaluación de los valores de entrada, según una serie de expresiones condicionales. En este ejemplo vamos a aplicar una función a los valores de presión sanguínea (sistólica y diastólica), para evaluar la categoría de diagnóstico que le corresponde, de acuerdo a la tabla de la American Heart Association.

# creación de función
PSx <- function(s,d) {
  if (s <= 90 && d <= 60) {
    "Hipotensión"
  } else if (s < 120 && d <= 80) {
      "Presión Normal"
  } else if (s >= 120 && s <= 129 && d <= 80) {
      "Presión Elevada"
  } else if ((s >= 130 && s <= 139) || (d > 80 && d <= 89)) {
      "Hipertensión Etapa 1"
  } else if (s >= 140 || d >= 90) {
      "Hipertensión Etapa 2"
  } else if (s >= 180 || d >= 120) {
      "Crisis Hipertensiva"
    }
}

Una vez creada la función (PSx), podemos aplicarla a valores medidos de presión sistólica y diastólica.

# función PSx(sistólica, diastólica)
# paciente 1
PSx(117, 79)
## [1] "Presión Normal"
# paciente 2
PSx(128,83)
## [1] "Hipertensión Etapa 1"

2.3.2. Controles tipo bucle con for.

Al finalizar esta sección podrás aplicar un código a una secuencia de valores o expresiones condicionales

Los bucles se utilizan en la programación para repetir un bloque de código específico. Existen dos formas principales: for y while.

La sintaxis para un bucle for

for (valor indicador in secuencia de valores)
{
expresión
}

A continuación un ejemplo del uso básico de for, para contar los números pares en una secuencia:

# secuencia x de valores
x <- c(2,5,3,9,8,11,6)
# inicio de variable acumuladora
count <- 0
# expresión for 
for (val in x) {
if(val %% 2 == 0)  count = count+1
}
print(count)
## [1] 3

Uso del bucle while

Los bucles while se utilizan para realizar un bucle hasta que se cumple una condición específica.

Su sintaxis:

while (expresión de control)
{
expresión
}

Ejemplo de uso del bucle while:

# variable con un valor inicial
i <- 1
# bucle while con un contador e instrucción de salida
while (i < 6) {
print(i)
i = i+1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

Uso combinado de for, if y else

Podemos combinar los diferentes tipos de control de flujo, según la tarea que deseamos realizar con los datos. Usualmente hay varias formas de conseguir un mismo propósito, unas más eficientes que otras. A continuación vamos analizar datos adquiridos en encuestas y mediciones relacionadas a los protocolos de prevención de CoviD-19; el propósito es “leer” los datos tomados al final del día y tomar una decisión de cómo actuar con los individuos para el otro día, de acuerdo a un protocolo de seguridad, traducido a expresiones de decisión dentro de un bucle for.

## creación de base de datos inicial
# temperatura máxima registrada en los individuos en un día
Temp <- c(38.5,38.2,36.8,38.4,37.1,38,36.8,37.5)
# Indicador de contacto con positivo confirmado
# 0 = no-contacto, 1 = contacto confirmado
Contacto <- c(0,1,0,1,1,0,0,0)
# variable de acción a tomar con individuo - condición inicial "NA"
Accion <- rep("NA",8)
# número secuencial de identificación
n <- length(Temp)
ID <- seq(1:n)
# data.frame
Entrada <- data.frame(ID,Temp,Contacto,Accion)
Entrada
##   ID Temp Contacto Accion
## 1  1 38.5        0     NA
## 2  2 38.2        1     NA
## 3  3 36.8        0     NA
## 4  4 38.4        1     NA
## 5  5 37.1        1     NA
## 6  6 38.0        0     NA
## 7  7 36.8        0     NA
## 8  8 37.5        0     NA

Procesamos los datos según unas reglas de decisión pre-establecidas, y producimos un nuevo data.frame (Entrada) con las acciones a tomar con los individuos.

# bucle con decisiones anidadas
for (i in ID)
  {
  if (Entrada$Temp[i] < 38 && Entrada$Contacto[i] == 0) {
    Entrada[i,4] <- c("Acceso")
  } else if (Entrada$Temp[i] >= 38 && Entrada$Contacto[i] != 0) {
    Entrada[i,4] <- c("NO-Acceso")
  } else if (Entrada$Temp[i] >= 38 || Entrada$Contacto[i] != 0) {
    Entrada[i,4] <- c("Vigilancia")
  }
}
# mostrar datos
Entrada
##   ID Temp Contacto     Accion
## 1  1 38.5        0 Vigilancia
## 2  2 38.2        1  NO-Acceso
## 3  3 36.8        0     Acceso
## 4  4 38.4        1  NO-Acceso
## 5  5 37.1        1 Vigilancia
## 6  6 38.0        0 Vigilancia
## 7  7 36.8        0     Acceso
## 8  8 37.5        0     Acceso

Referencias

R if…else Statement (With Examples), 2017. . DataMentor. URL https://www.datamentor.io/r-programming/if-else-statement/ (accessed 2.8.21).


Home