Estructuras de Control. 

Al igual que en otros lenguajes de programación, las estructuras de control en R permiten controlar el flujo de la ejecución de un programa. Las estructuras más comunes son if, else; for; while; repeat; break; next; y return. La mayoría de estructuras de control no son usadas en las sesiones interactivas, pero son usadas al escribir funciones o expresiones más complejas. 

if

Comencemos con la sentencia if. Se usa para hacer una pregunta lógica y tomar decisiones. En el siguiente ejemplo asignaremos un valor a la variable x y preguntaremos si este valor es mayor a 5. Si es cierto, entonces asignaremos 1 a y, de lo contrario se le asignará 0. Posteriomente imprimiremos este valor en la pantalla. 

> x <- 10
> if(x>5){
+ y <- 1
+ } else{
+ y <- 0
+ }
> print(y)
[1] 1

Esto es equivalente a la siguiente construcción, donde es posible manejar a un if con una salida que se redirigirá con el operador <-. En el ejemplo siguiente se hace un equivalente al ejemplo anterior, con esta nuevo formato. 

> x <- 10 
> m <- if(x > 5){
+ 1
+ } else {
+ 0
+ }
> print(m)
[1] 1

for

La próxima estructura a revisar es for. Esta es bastante común para crear ciclos y toma una variable de iteración y asigna susecivamente valores de una secuencia de valores. Son muy usados para iterar sobre elementos de una lista, vector u otros objetos. 

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

Cómo se ha descrito, esto es importante si se toma en cuenta una lista o un objeto sobre el cuál interar:

[1]  3  6  4 14  3  2  4
> b <- 0
> for ( i in a){
+ b<-b+i
+ }
> b
[1] 22

También es posible iterar sobre el índice de los elementos de la lista:

> a
[1]  1  4  2 12  1  0  2
> for(i in 1:7){
+ print(a[i])
+ }
[1] 1
[1] 4
[1] 2
[1] 12
[1] 1
[1] 0
[1] 2

También es posible evitar usar las llaves, pero la instrucción debe de ponerse en la misma línea que el for

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

Para determinar el tamaó del arreglo sobre el que vamos a iterar usamos la función seq_along de la siguiente forma:

> for (i in seq_along(a)){
+ print(a[i])
+ }
[1] 1
[1] 4
[1] 2
[1] 12
[1] 1
[1] 0
[1] 2

 Por otro lado, si queremos iterar sobre una matriz necesitamos un for anidado. 

> x <- matrix(c("a","b","c","d","e","f"),2,3)
> x
     [,1] [,2] [,3]
[1,] "a"  "c"  "e"
[2,] "b"  "d"  "f"
> for(i in seq_len(nrow(x))){
+   for(j in seq_len(ncol(x))){
+     print(x[i,j])
+   }
+ }
[1] "a"
[1] "c"
[1] "e"
[1] "b"
[1] "d"
[1] "f"

 while

Estos ciclos prueban una condición al iniciar y no terminan hasta que se incumpla la condición especificada. La acción al interior del cuerpo del while se repetirá todas las veces hasta que se se termine el ciclo. 

> c <- 0
> while(c < 5){
+ print(c)
+ c <- c + 1
+ }
[1] 0
[1] 1
[1] 2
[1] 3
[1] 4

La instrucción repeat ejecuta un ciclo infinito. Pero para terminar un ciclo es posible también usar la instrucción break, que sirve para interrumpirlo. Esta instrucción no únicamente sirve para finalizar repeat, si no cualquier otro ciclo. Damos un ejemplo de cómo funcionan:

> x <- 10
> repeat{
+ if (x < 5){
+ break
+ } else{
+ x <- x - 1
+ print(x)
+ }
+ }
[1] 9
[1] 8
[1] 7
[1] 6
[1] 5
[1] 4

Una instrucción semejante es next, que nos permitirá interrumpir el ciclo actual, y pasar a la siguiente iteración

> for(i in 1:10){
+ if(i<5){
+ print("bajo")
+ next
+ }
+ print(i)
+ }
[1] "bajo"
[1] "bajo"
[1] "bajo"
[1] "bajo"
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

 Funciones en R

 Las funciones permite unir una serie de instrucciones y ahorrar críticamente. Usualmente estas funciones son escritas en un archivo específico, en vez de agregarlo directamente a la línea de comandos. 

Vamos a crear primer un archivo R que se llame exp.r que contenga la función. Posteriormente vamos a guardar ese archivo y cargarlo desde R con la función source() al espacio de trabajo interactivo. 

suma <- function(x,y){
  x+y
}

Para llamar a la función será necesario:

> source("exp.r")
> suma(12,3)
[1] 15

Ahora bien, intentaremos hacer lago un poco más difícil. Esta vez realizaremos una función de media, que no es la más óptima, por mucho. Sin embargo, mostraremos una versión que ejemplifica una función más compleja. Agregamos a nuestro archivo exp.r

mymean <- function(x){
  val <- 0
  for (i in x){
    val <- val + i
  }
  val / length(x)
}

Y lo importamos a la sesión:

> x <- c(1,10,2,20,5)
> source("exp.r") > diez(x,4)

 

 

 

Share This