https://www.polymetrix.mx

Introducción

Las estructuras de control permiten modificar el flujo de ejecución de las instrucciones de un programa. Con las estructuras de control se puede, de acuerdo con una condición, ejecutar un grupo u otro de sentencias. Las estructuras de control son básicamente 6 y son las siguientes:

Este trabajo publica ejemplos, pero lo central es el uso de los comandos:

if, else

Una instrucción if-else controla la bifurcación condicional. Las instrucciones de if se ejecutan solo si la condición se evalúa como un valor distinto de cero (o true). De lo contrario, se ejecuta la instrucción else.

if else: ejemplo 1 if else

Uso if else, este script define si el número es positivo o negativo.

# Sea r
r = -5
r
## [1] -5
if (r < 0) {
  x = "Negativo"
} else {
  x = "Positivo"
}
x
## [1] "Negativo"

if else: ejemplo 2 doble else if

El uso de 2 veces else if, se puede repetir cuantas veces sea necesario

# Sea r
r = 8
r
## [1] 8
if (r < 8) {
  x = 1
} else if (r > 8) {
  x = 2
} else {
  x = 3
}
x
## [1] 3

if else: ejemplo 3 if else en data.frame

Uso if else con lógica poco más compleja, saber si existe una palabra en un encabezado de una columna, si en el data.frame existe la palabra Species en iris: iris es un data.frame integrado en R que contiene medidas de 4 atributos diferentes (en centímetros) para 50 flores de 3 especies diferentes. Se desea por 1 si en los encabezados existe Species y 0 en otro caso

# Inicia la carga de iris
data(iris)
# Se observa que sí existe Species en los encabezados
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
# Se extraen en un vector los encabezados
h = colnames(iris)
print(h)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"
# Class del vector es character
class(h)
## [1] "character"
# Generación del vector lógico comparativo
j = h == "Species"
j
## [1] FALSE FALSE FALSE FALSE  TRUE
# Aplicación if else, si coincide un encabezado la suma será 1
if (sum(j) == 1) {
  x = 1
} else {
  x = 0
}
x
## [1] 1

for

Un for en programación se usa cuando queremos repetir un conjunto de instrucciones un número finito de veces. Es decir, se sabe de antemano cuantos pasos se van a realizar.

for: ejemplo 1

Los números cuadrados del 1 al 5

for (i in 1:5){
  print(i^2)
}
## [1] 1
## [1] 4
## [1] 9
## [1] 16
## [1] 25

for: ejemplo 2 vector con los resultados

Vector con los números cuadrados del 1 al 5

w = NULL
for (i in 1:5){
  w = c(w,i^2)
  print(w)
}
## [1] 1
## [1] 1 4
## [1] 1 4 9
## [1]  1  4  9 16
## [1]  1  4  9 16 25
  print(w)
## [1]  1  4  9 16 25
  class(w)
## [1] "numeric"

for: ejemplo 3 data.frame

se utiliza el conjunto de datos iris. Para este caso en particular, se podría resolver con apply()

# Inicia la carga de iris
data(iris)
# La estructura for, desde 1 hasta ncol(iris) que en este caso es 5
for (i in 1:(ncol(iris)-1)){
  print(paste(colnames(iris[i]), round(mean(iris[,i], na.rm = TRUE), digits = 1)))
}
## [1] "Sepal.Length 5.8"
## [1] "Sepal.Width 3.1"
## [1] "Petal.Length 3.8"
## [1] "Petal.Width 1.2"

for: ejemplo 4 vectores no numéricos

No todos los for tienen que ser numéricos, este es un ejemplo

# Se define un vector sin números
mis_letras = c("a", "b", "c", "d")
# La estructura for, desde 1 hasta ncol(iris) que en este caso es 5
for (i in mis_letras){
  print(i)
}
## [1] "a"
## [1] "b"
## [1] "c"
## [1] "d"

while

A diferencia de for que, sí sabemos cuántos pasos se van a realizar, en while no. while puede tener más de 1 condición. La estructura repetitiva mientras (en ingles while), es aquella en que el cuerpo del bucle se repite mientras se cumple una determinada condición. Cuando se ejecuta la instrucción mientras, la primera cosa que sucede es evaluar la condición (una expresión booleana).

while: ejemplo 1

Uso while, generración de los 10 primeros números 1:10. Obsérvese que primero se imprime print y después suma, por lo tanto, el 11 sí entra en el bucle pero no se imprime.

# Sea contador
contador = 1
contador
## [1] 1
while (contador <= 10) {
  print(contador)
  contador = contador + 1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10

while: ejemplo 2

Uso while, generración de los 10 primeros números 1:10. A diferencia del anterior, únicamente se van a imprimir print los números generados.

# Sea contador
contador = 1
contador # el contador inicia desde 0
## [1] 1
while (contador < 10) {
  contador = contador + 1
  print(contador)
}
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10

while: ejemplo 3 multicondicional

Uso while, Puede tener más de una condición Se generan números aleatorios entre 0 y 1, while se detendrá cuando el error sobre 0.5 la media natural entre 0 y 1 esté entre -0.05 y +0.05, es decir, la media de los valores estará entre 0.45 y 0.55, para este caso en particular set.seed(1) sólo se necesitaron 4 intentos para la convergencia, sin embargo, si intentas con set.seed(72) se necesitan 120 números aleatorios para obtener el error deseado.

# Sean
i = 1
e = 1
media = 0
set.seed(1)
while (e < -0.05 || e > 0.05) {
  media = (media*(i-1) + runif(1,0,1))/i
  e = 0.5 - media
  paste(print(i),print(e))
  i = i + 1
}
## [1] 1
## [1] 0.2344913
## [1] 2
## [1] 0.1811837
## [1] 3
## [1] 0.09650469
## [1] 4
## [1] -0.02967343

while: ejemplo 4 while para filtrar data.frame con if else

Del mismo data set iris, se va a filtrar la especie virginica, esto se puede hacer con el siguiente script: iris[iris$Species == “virginica”,], sin embargo, la intención es usar while

# Se irá filtrando y pegando fila por fila
data("iris")
i = 1
i
## [1] 1
r = NULL
r
## NULL
while (i <= nrow(iris)) {
  if (iris[i,5] ==  "virginica"){
    r = rbind.data.frame(r, iris[i,])
  } else {
    r
  }
  i = i + 1
}
print(r)
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 101          6.3         3.3          6.0         2.5 virginica
## 102          5.8         2.7          5.1         1.9 virginica
## 103          7.1         3.0          5.9         2.1 virginica
## 104          6.3         2.9          5.6         1.8 virginica
## 105          6.5         3.0          5.8         2.2 virginica
## 106          7.6         3.0          6.6         2.1 virginica
## 107          4.9         2.5          4.5         1.7 virginica
## 108          7.3         2.9          6.3         1.8 virginica
## 109          6.7         2.5          5.8         1.8 virginica
## 110          7.2         3.6          6.1         2.5 virginica
## 111          6.5         3.2          5.1         2.0 virginica
## 112          6.4         2.7          5.3         1.9 virginica
## 113          6.8         3.0          5.5         2.1 virginica
## 114          5.7         2.5          5.0         2.0 virginica
## 115          5.8         2.8          5.1         2.4 virginica
## 116          6.4         3.2          5.3         2.3 virginica
## 117          6.5         3.0          5.5         1.8 virginica
## 118          7.7         3.8          6.7         2.2 virginica
## 119          7.7         2.6          6.9         2.3 virginica
## 120          6.0         2.2          5.0         1.5 virginica
## 121          6.9         3.2          5.7         2.3 virginica
## 122          5.6         2.8          4.9         2.0 virginica
## 123          7.7         2.8          6.7         2.0 virginica
## 124          6.3         2.7          4.9         1.8 virginica
## 125          6.7         3.3          5.7         2.1 virginica
## 126          7.2         3.2          6.0         1.8 virginica
## 127          6.2         2.8          4.8         1.8 virginica
## 128          6.1         3.0          4.9         1.8 virginica
## 129          6.4         2.8          5.6         2.1 virginica
## 130          7.2         3.0          5.8         1.6 virginica
## 131          7.4         2.8          6.1         1.9 virginica
## 132          7.9         3.8          6.4         2.0 virginica
## 133          6.4         2.8          5.6         2.2 virginica
## 134          6.3         2.8          5.1         1.5 virginica
## 135          6.1         2.6          5.6         1.4 virginica
## 136          7.7         3.0          6.1         2.3 virginica
## 137          6.3         3.4          5.6         2.4 virginica
## 138          6.4         3.1          5.5         1.8 virginica
## 139          6.0         3.0          4.8         1.8 virginica
## 140          6.9         3.1          5.4         2.1 virginica
## 141          6.7         3.1          5.6         2.4 virginica
## 142          6.9         3.1          5.1         2.3 virginica
## 143          5.8         2.7          5.1         1.9 virginica
## 144          6.8         3.2          5.9         2.3 virginica
## 145          6.7         3.3          5.7         2.5 virginica
## 146          6.7         3.0          5.2         2.3 virginica
## 147          6.3         2.5          5.0         1.9 virginica
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica

for y while: ejemplo 5 intentos promedios

Uso for y while del ejemplo anterior 4 para while, para obtener la cantidad de intentos promedios para lograr el error de 10%, es decir, entre (-0.05, 0.05)

# Sean
j = 1
w = NULL
for (j in 1:10000) {
i = 1
e = 1
media = 0
set.seed(j)
while (e < -0.05 || e > 0.05) {
  media = (media*(i-1) + runif(1,0,1))/i
  e = 0.5 - media
  i = i + 1
}  
w = c(w, i-1)
j = j + 1
}

Después de 10 mil ciclos for para cada while, el promedio debería ser cercano a 10 y resultó ser 9.842, los intentos mínimos son 1 y los intentos máximos son 374

summary(w)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   4.000   9.842   9.000 374.000

repeat y break

repeat: ejecuta un bucle indefinidamente (la única forma de detener esta estructura es mediante el comando break). Este tipo de comandos se suelen utilizar poco.

repeat y break: ejemplo 1

repeat asegura que las operaciones que contiene sean iteradas al menos en una ocasión. Si no incluimos un break, el bucle se repetirá indefinidamente y sólo lo podremos detener de manera manual.

# Sea contador
contador = 0
repeat {
  contador = contador + 1
  if(contador == 10) {
    break
  }
}
# Finalmente el resultado
print(contador)
## [1] 10

repeat y break: ejemplo 2

En este ejemplo se van a generar números aleatorios entre 0 y 1 y el break será cuando supere el 0.95, el resultado nos dirá el valor que fue mayor a 0.95 y en que intento

# Sea contador y aleatorio
contador = 0
repeat {
  set.seed(contador)
  contador = contador + 1
  aleatorio = runif(1,0,1)
  if(aleatorio > 0.95) {
    break
  }
}
# Finalmente el resultado
print(contador)
## [1] 8
print(aleatorio)
## [1] 0.9889093

next: ejemplo 1

next se brinca los primeros 10 números.

for (i in 1:50){
  if(i <= 10){
    next
  }
  print(i)
}
## [1] 11
## [1] 12
## [1] 13
## [1] 14
## [1] 15
## [1] 16
## [1] 17
## [1] 18
## [1] 19
## [1] 20
## [1] 21
## [1] 22
## [1] 23
## [1] 24
## [1] 25
## [1] 26
## [1] 27
## [1] 28
## [1] 29
## [1] 30
## [1] 31
## [1] 32
## [1] 33
## [1] 34
## [1] 35
## [1] 36
## [1] 37
## [1] 38
## [1] 39
## [1] 40
## [1] 41
## [1] 42
## [1] 43
## [1] 44
## [1] 45
## [1] 46
## [1] 47
## [1] 48
## [1] 49
## [1] 50

next: ejemplo 2

next del mismo while de ejemplo 4, pero con los comandos for y next, en el que sólo se filtrarán la especie “virginica”.

# Se irá filtrando y pegando fila por fila
data("iris")
i = 0
i
## [1] 0
r = NULL
r
## NULL
for (i in 1:nrow(iris)) {
  if(iris[i,5] != "virginica"){
    next
  }
  r = rbind.data.frame(r, iris[i,])
}
  print(r)
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 101          6.3         3.3          6.0         2.5 virginica
## 102          5.8         2.7          5.1         1.9 virginica
## 103          7.1         3.0          5.9         2.1 virginica
## 104          6.3         2.9          5.6         1.8 virginica
## 105          6.5         3.0          5.8         2.2 virginica
## 106          7.6         3.0          6.6         2.1 virginica
## 107          4.9         2.5          4.5         1.7 virginica
## 108          7.3         2.9          6.3         1.8 virginica
## 109          6.7         2.5          5.8         1.8 virginica
## 110          7.2         3.6          6.1         2.5 virginica
## 111          6.5         3.2          5.1         2.0 virginica
## 112          6.4         2.7          5.3         1.9 virginica
## 113          6.8         3.0          5.5         2.1 virginica
## 114          5.7         2.5          5.0         2.0 virginica
## 115          5.8         2.8          5.1         2.4 virginica
## 116          6.4         3.2          5.3         2.3 virginica
## 117          6.5         3.0          5.5         1.8 virginica
## 118          7.7         3.8          6.7         2.2 virginica
## 119          7.7         2.6          6.9         2.3 virginica
## 120          6.0         2.2          5.0         1.5 virginica
## 121          6.9         3.2          5.7         2.3 virginica
## 122          5.6         2.8          4.9         2.0 virginica
## 123          7.7         2.8          6.7         2.0 virginica
## 124          6.3         2.7          4.9         1.8 virginica
## 125          6.7         3.3          5.7         2.1 virginica
## 126          7.2         3.2          6.0         1.8 virginica
## 127          6.2         2.8          4.8         1.8 virginica
## 128          6.1         3.0          4.9         1.8 virginica
## 129          6.4         2.8          5.6         2.1 virginica
## 130          7.2         3.0          5.8         1.6 virginica
## 131          7.4         2.8          6.1         1.9 virginica
## 132          7.9         3.8          6.4         2.0 virginica
## 133          6.4         2.8          5.6         2.2 virginica
## 134          6.3         2.8          5.1         1.5 virginica
## 135          6.1         2.6          5.6         1.4 virginica
## 136          7.7         3.0          6.1         2.3 virginica
## 137          6.3         3.4          5.6         2.4 virginica
## 138          6.4         3.1          5.5         1.8 virginica
## 139          6.0         3.0          4.8         1.8 virginica
## 140          6.9         3.1          5.4         2.1 virginica
## 141          6.7         3.1          5.6         2.4 virginica
## 142          6.9         3.1          5.1         2.3 virginica
## 143          5.8         2.7          5.1         1.9 virginica
## 144          6.8         3.2          5.9         2.3 virginica
## 145          6.7         3.3          5.7         2.5 virginica
## 146          6.7         3.0          5.2         2.3 virginica
## 147          6.3         2.5          5.0         1.9 virginica
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica