Las estructuras de control nos permiten controlar el flujo de ejecución de una secuencia de comandos. De este modo, podemos poner “lógica” en el código de R y lograr así reutilizar fragmentos de código una y otra vez.

Las estructuras de control más utilizadas son:

if / else: permite decidir si ejecutar o no un fragmento de código en función de una condición.
for: ejecuta un bucle una cantidad fija de veces.
while: ejecuta un bucle mientras sea verdadera una condición.
repeat: ejecuta un bucle indefinidamente (la única forma de detener esta estructura es mediante el comando break).
break: detiene la ejecución de un bucle.
next: salta a la siguiente ejecución de un bucle.

La mayoría de estas no son usadas en sesiones interactivas (cuando escribimos código directo en la consola), sino cuando escribimos funciones o expresiones largas. En el próximo post veremos como trabajar con funcionar en R, pero de momento es necesario tomar conocimiento de las estructuras de control, ya que haremos amplio uso de ellas en el futuro.

 

r_estructuras_control

 

IF-ELSE


La combinación IF-ELSE es la más utilizada en R. Esta estructura de control permite actuar en función de una condición. La sintaxis es:

if(<condicion>) {
  ## bloque de código
}

## Continue with rest of code
if(<condicion>) {
  ## bloque de código
} else {
  ## otro bloque de código
}

if(<condition1>) {
  ## bloque de código
} else if(<condicion2>) {
  ## otro bloque de código
} else {
  ## otro bloque de código
}

Ejemplo:

x <- runif(1, 0, 10) ## creamos un nro aleatorio entre 0 y 10
if(x > 5) {
  y <- TRUE
} else {
  y <- FALSE
}

De este modo estamos asignando un valor a una variable en función del valor de otra. Lo que se debe tener en cuenta es que la condición debe retornar un valor TRUE o FALSE.

Otra opción para usar la estructura IF-ELSE en forma más comprimida es mediante al función ifelse:

# ifelse(condicion, TRUE, FALSE)

ifelse( runif(1) > 0.5, "A", "B")

 

SWITCH


El comando SWITCH permite ejecutar un bloque de código distinto en función del valor de una variable.

switch(<EXPR>,
       <valor_1> {# código},
       ...
       <valor_n> {# código})

Ejemplo:

x <- 1:10
type <- 'mean'
switch(type,
         mean = mean(x),
         median = median(x),
         sd = sd(x))
[1] 5.5

 

FOR


Los bucles FOR son el tipo de bucle más utilizado en R. Estos toman una variable a la que se le asignan los elementos de un objeto (en general, vectores o listas) en forma sucesiva a medida que se van recorriendo los ciclos.

for(<variable> in <objeto iterable>) {
  # código
  ...
}

Ejemplo:

for(i in 1:5) {
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

Tanto con la sentencia IF como con el bucle FOR, en caso de que solo se ejecute una única sentencia, no es estrictamente necesario el uso de las llaves, no obstante es una buena practica utilizarlas incluso en estos casos.

# for(<variable> in <objeto iterable>) <código>
for(i in 1:5) print(i)
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

Si queremos recorrer los elementos de un objeto podemos realizarlo directamente, o por su índice ayudándonos de la función seq_along(x), la cual genera una secuencia numérica que usaremos para indica los indices de los elementos de los objetos que queremos recorrer:

# Creamos un vector sobre el cual vamos a iterar
x <- c("a", "b", "c", "d")
seq_along(x)
[1] 1 2 3 4

# Podemos iterar accediendo a los elementos por su índice
for(i in seq_along(x)) {
print(x[i])
}
[1] "a"
[1] "b"
[1] "c"
[1] "d"

# o podemos acceder a estos directamente
for(letra in x) {
  print(letra)
}
[1] "a"
[1] "b"
[1] "c"
[1] "d"

En caso en que se quisiera recorrer una estructuras de más de una dimensión, como puede ser una matriz, simplemente anidamos bucles FOR:

x <- matrix(1:6, 2, 3)
x
     [,1] [,2] [,3]
[1,]   1    3    5
[2,]   2    4    6

for(i in seq_len(nrow(x))) {
  for(j in seq_len(ncol(x))) {
    print(x[i, j])
  }
}
[1] 1
[1] 3
[1] 5
[1] 2
[1] 4
[1] 6

 

WHILE


Los bucles WHILE comienzan comprobando una condición. Si esta es verdadera, entonces se entra al cuerpo del bucle. Una vez completada una ejecución de este bloque, se comprueba la condición nuevamente y así sucesivamente hasta que la comprobación de la condición de falso.

while(<condicion>) {
  # código
  ...
}

Ejemplo:

count <- 0
while(count < 10) {
  print(count)
  count <- count + 1
}

[1] 0
...
[1] 9

 

REPEAT


La estructura REPEAT ejecuta un bucle infinitamente. En general no es utilizada para realizar análisis, sino cuando se realiza programación. La única forma de terminar con el bucle es llamando dentro de este a la función break.

repeat(<condicion>) {
  # código
  ...
}

Ejemplo:

count <- 0
repeat {
  print(count)
  count <- count + 1
  if(count == 10) break
}
[1] 0
...
[1] 9

 

NEXT / BREAK


La función next es utilizada para terminar un ciclo del bucle en ejecución y pasar al siguiente. Por ejemplo, si estamos dentro de un bucle FOR lo que sucedería al momento de ejecutar la función next es que se se salta directo al siguiente elemento sobre sobre el que se está iterando.

Ejemplos:

# Imprimimos por pantalla los numero pares entre 1 y 10
for(i in 1:10) {
 if(i %% 2 == 0) next 
 print(i)
}

Por el contrario, la función break es usada para detener un bucle y salir de él inmediatamente.

# Recorremos los elementos de un vector hasta encontrar una condición y salir de él
for(i in mtcars$mpg) {
  print(i)
  if(i < 15) break
}

[1] 21
[1] 21
[1] 22.8
[1] 21.4
[1] 18.7
[1] 18.1
[1] 14.3

 

Comentarios

3 Comments

  1. Martin

    ¿como puedo hacer para tomar una matriz de (por ejemplo) 2414 filas por 71 columnas, y pedirle que a los primeros 34 filas de la columna 1 las reemplaze por valor 0, a las segunda 34 fila (es decir, 35 a 68) de la segunda columna,y asi sucesivamente hasta la columna 71? Entiendo que deberia ser con el uso de la función for para matrices pero no logro entender como hago que salte de 1:34 en la columna a 35:68 en la columna 2, y sucesivametne.

    Gracias!

    Reply
  2. Caleb Terrel

    Que tal, acabo de revisar y si me corre !! aqui un ejemplo
    x = 15
    y = 10
    # el codigo corre en una sola ejecución…
    if(x == y) {
    cat(“iguales”)
    } else if (x < y) {
    cat("x menor a y")
    } else {
    cat("x mayor a y")}

    Reply
  3. Caleb Terrel

    Hola, en el tema de IF ELSE, en el 3er bloque del codigo:
    if() {
    ## bloque de código
    } else if() {
    ## otro bloque de código
    } else {
    ## otro bloque de código
    }

    ¿no te estas referiendo a un codigo de multiples sentencias if? si es asi el codigo no resulta porque antes del segundi IF deberia ir } …

    Reply

Submit a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

This site uses Akismet to reduce spam. Learn how your comment data is processed.