Bucles en R

DESCRIPCIÓN: Apuntes detallados de los bucles for y while aplicados al lenguaje de programación R y con ejemplos y ejercicios para practicar.

JUSTIFICACIÓN: Estos apuntes se han hecho con la finalidad de ayudar a futuros estudiantes de Biotecnología a entender los bucles for y while.

RECOMENDACIÓN DE USO: Este recurso está pensado sobre todos para alumnos que han ido a clase y no han conseguido entender los bucles o para alumnos que quieren profundizar más en ellos.

CONTROL DE CALIDAD: Todos los miembros del equipo han leído los apuntes y han dado su aprobación.

 

Para descargar este contenido, se puede acceder al pdf en el siguiente enlace:

https://drive.google.com/file/d/1TBoYlpizAAm7w3C3nlXoP6uYGgkN27we/view?usp=share_link

 

 

Bucles forwhile

 

A la hora de programar, muchas veces nos interesa repetir una misma acción u operación varias veces, ya sea un número concreto de ellas o mientras se cumpla una determinada condición. Para evitar tener que escribir reiteradamente la misma orden, contamos con los bucles for y while que, a rasgos generales, consisten en repetir una misma operación mientras se cumpla la condición que nosotros indiquemos. 

 

Bucle for 

 

Su estructura funciona como un contador de vueltas con tres elementos claves: 

 

– Contador: variable que determina cuántas veces se repetirá el proceso

– Incremento: número que indica cuánto aumenta el valor del contador al terminar el proceso 

– Acción: instrucción que indica la operación o el proceso a realizar 

 

Cuando comienza el bucle, el “contador”, al que asignaremos un nombre de variable, tiene un valor inicial que nosotros especificaremos (puede empezar tanto en cero como en uno, 3558, -4095 o el número que nos interese a la hora de programar). Al mismo tiempo, habrá que fijar al principio cuál va a ser el valor final de la variable, es decir, el número en el cual el contador dejará de contar y que, por tanto, determinará cuántas veces se va a repetir la acción. Por ejemplo, si inicialmente especificamos que nuestro contador va a ir desde 5 hasta 20 eso significará que la acción se repetirá 16 veces (no son quince porque se incluyen tanto el primer valor como el último). A la hora de escribirlo, se indicaría de la siguiente manera: 

 

for (i in 5:20)

 

Primero escribimos el tipo de bucle que estamos creando, en este caso for. A continuación, entre paréntesis añadimos los valores que va a tomar nuestro contador, escribiendo el nombre de la variable seguido de la palabra in y de los valores inicial y final que va a tomar dicha variable separados por dos puntos. En este caso, hemos llamado al contador con la variable i, hemos tomado como valor inicial 5 y como valor final 20. 

 

Además, si no nos interesa que el contador vaya de uno en uno sino que avance más números cada vez (por ejemplo que en cada vuelta el contador aumente su valor dos unidades, empezando en 5, a la siguiente vuelta valiendo 7 y así sucesivamente), entonces habría que especificar cuál es el incremento, lo que se haría como se indica a continuación: 

 

for (i in seq(5,21,2))

 

Es decir, el comando es el mismo pero añadiendo detrás del in la palabra seq seguida entre paréntesis de los valores inicial, final y el incremento separados por comas y escritos en ese orden. Como el contador solo toma valores impares en este ejemplo, hemos cambiado el valor final a 21. Cuanto mayor sea el incremento, menor será el número de veces que se repita la acción. En este caso, por ejemplo, al poner de incremento dos, el proceso se repetirá ocho veces, la mitad que en el ejemplo anterior. 

IMPORTANTE: recordar luego cerrar ambos paréntesis. 

 

Por último, la acción que se quiere llevar a cabo se escribe entre llaves ({}). Esta acción puede o no incluir en su desarrollo a la propia variable del contador, aunque lo más frecuente es que sí que aparezca en la fórmula, ya sea como operador numérico o como subíndice. Para clarificar esto, se muestran dos ejemplos. 

 

  1. a) Incluyendo la variable como operador: sumar los diez primeros números naturales

 

suma=0

for (i in 1:10){

suma=suma+i

}

suma

55

 

Como se puede observar, esta forma de operar resulta más práctica que tener que escribir la operación número a número (suma=1+2+3+4+5+6+7+8+9+10). De ambas formas el resultado es el mismo, pero con el bucle conseguimos optimizar tiempo y espacio ganando productividad a la hora de programar. 

 

  1. b) Incluyendo la variable como subíndice: sumar los vectores u y v

 

u=c(3,2,1)

v=c(1,-1,0)

suma=c(0)

for (i in 1:3){

suma[i]=u[i]+v[i]

}

suma

[1] 4 1 1

 

En este caso la variable i, además de contar, indica la componente del vector que estamos sumando, de tal forma que empieza sumando la primera componente de los vectores u y v. Al no haber incremento presupone por defecto que el incremento es uno, así que la i pasa a valer dos cuando termina la operación, y vuelve a empezar el bucle. Suma la segunda componente de ambos vectores y la coloca en la segunda componente del vector suma. Aumenta su valor en una unidad (ahora i=3). Suma la tercera componente de los vectores y guarda ese valor en la tercera componente del vector suma. Termina el bucle y presenta el vector suma (ya no sigue el bucle porque la i ha alcanzado su valor final que era tres, así que el proceso automáticamente se detiene). 

 

Bucle while 

 

El funcionamiento y la estructura del bucle while es prácticamente el mismo que el del bucle for salvo por una leve modificación en la condición inicial. Mientras que en el bucle for establecíamos desde un principio el número de veces que se iba a repetir el proceso, en el bucle while en la mayoría de las ocasiones no tendremos ni idea de cuántas repeticiones habrá. Por tanto, se sirve de otro mecanismo para identificar el final del bucle y que este no sea infinito. Dicho mecanismo consiste en una condición de comparación: mientras una determinada variable no sea mayor, menor o igual a una cierta cantidad, el bucle seguirá funcionando. La forma de escribirlo es la siguiente: 

 

while (condición){ 

Proceso 

 

En este caso, no existe un incremento, lo que significa que la variable (i) seguirá valiendo lo que valía al principio a no ser que en el proceso se indique lo contrario. 

 

Dentro de la condición, los símbolos que se pueden usar son igual que (=), distinto de (!=), menor que (<), mayor que (>), menor o igual que (<=) y mayor o igual que (>=). 

 

Veamos si con un ejemplo queda más claro. 

 

Imprimir todos los múltiplos de 11 entre 1 y 100:

 

i=11

while (i<=100){

print(i) i=i+11

}

[1] 11

[1] 22

[1] 33

[1] 44

[1] 55

[1] 66

[1] 77

[1] 88

[1] 99

 

Bucles anidados 

 

No vamos a hacer mucho incapié en ellos. Lo único necesario es saber que se trata de meter un bucle dentro de otro bucle. Por ejemplo, para construir una matriz puede haber un bucle para cada subíndice, de tal forma que primero se determine la fila en la que trabajamos y dentro de esa fila se vayan recorriendo todas las columnas de la primera a la última para pasar después a la siguiente fila y repetir el mismo mecanismo. 

 

Un ejemplo podría ser la suma de dos matrices: 

 

A=matrix(c(0),nrow=2,ncol=2)

B=matrix(c(0,5,-1,2),nrow=2,ncol=2)

C=matrix(c(1,1,0,2),nrow=2,ncol=2)

for (i in 1:2){

for (j in 1:2){

A[i,j]=B[i,j]+C[i,j]

}

}

A

         [,1]        [,2]

[1,]      1           -1

[2,]      6            4

 

Además, dentro de los bucles podemos meter otros elementos como los condicionales, de tal forma que si se cumple la condición del condicional haga una cosa y si no se cumple haga otra distinta. 

 

Ejemplo: programa que escriba los números positivos que hay entre los componentes de un vector.

 

v=c(1,-2,0,5,-4,7,9,-1,2,45,32,-78,-7,21,8,-54,11)

n=length(v)

for (i in 1:n){

if (v[i]>0){

print(v[i])

}

}

[1] 1

[1] 5

[1] 7

[1] 9

[1] 2

[1] 45

[1] 32

[1] 21

[1] 8

[1] 11

 

Ejercicios 

 

Ejercicio bucle for 

 

Calcular el número combinatorio sabiendo que la fórmula para calcularlo es:

 

Solución: 

 

n=10

k=2

factn=1

factk=1

factnk=1

for (i in 1:n){

factn=factn*i

}

for (i in 1:k){

factk=factk*i

}

for (i in 1:(n-k)){

factnk=factnk*i

}

comb=factn/(factk*factnk)

comb

[1] 45

 

Ejercicio bucle while

 

Programa que pruebe la conjetura de Collatz en distintos números, es decir, si el número es par dividirlo entre dos, y si es impar multiplicarlo por tres y sumarle uno. Así sigue el proceso hasta que se llegue al número 1. 

(NOTA: El resto de una división se indica con el comando dividendo%%divisor==resto)

 

Solución:

 

n=3015

while (n!=1){

if (n%%2==0){

n=n/2

}else{

n=3*n+1

}

}

n

[1] 1

Deja una respuesta

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