[MUSIC] Bienvenidos al módulo tres, del curso de Introducción a la Programación EstadÃstica con R, en este módulo aprenderemos a programar en R por primera vez. you que conocimos qué son los objetos, los tipos de datos que hay, las operaciones que podemos llevar a cabo con estos objetos. Lo primero que aprenderemos en esta lección es aprender las diferentes estructuras de control que se pueden utilizar en R. Y primero comenzaremos por definir su uso. Las estructuras de control nos permiten controlar el flujo de un programa dependiendo si se cumplen las condiciones o no de esta estructura. También permiten llevar a cabo tareas de manera repetida o alguna operación. Hay varios tipos, éstas pueden ser condicionales, pueden haber bucles de repetición, bucles de condición, bucles infinitos. Y también podemos usar algunos operadores para romper un bucle o saltarse uno de ellos. La primera estructura de control que vamos a estudiar, es la estructura if. If, como su nombre indica en inglés, significa si. La manera en como la sintaxis de esta estructura es: if entre paréntesis ponemos la condición y luego abrimos y cerramos llaves. Y en éstas pondremos las operaciones que se van a llevar a cabo. Si la condición se cumple, el cuerpo de esta condición se lleva a cabo y si no, podemos incluso poner más condiciones utilizando la palabra else y abriendo otro if. En el ejemplo que están viendo en pantalla, lo que tenemos es una variable llamada r que tiene el valor número 4. Y probamos si sà esa condición se cumple, entonces lo que va a hacer es que el valor de un objeto llamado x, objeto o variable llamado x va a tener valor 1. En caso contrario, x va a ser igual a 3 y crea otra variable nueva llamada y que va a ser igual a 4. Entonces si ejecutamos esto podemos ver que como r en un principio sà era igual a 3, sólo se ejecuta la primera parte que es igual a 1. Si mandamos a llamar la variable y, podemos observar que nos dará un error porque ésta nunca fue creada. ¿Por qué razón?, porque nunca entró a esa parte de la condición. ¿Por qué?, porque r era igual a cuatro. Contrario a lo que pasa en este ejemplo. Si r vale igual a tres desde un principio, si ejecutamos nuestro if, podemos ver que ahora x es igual a tres, y y si existe, y es igual a cuatro. ¿Por qué?, porque ahora si se ejecutó esa parte del código. Donde x toma ese valor, y y se crea. Sólo para revisar una vez más, podemos observar que la forma idiomática, o la forma más usada del if, es poniendo el if, poniendo entre paréntesis la condición, se abre llaves y se cierra llaves y dentro de estas llaves se ponen las operaciones que se van a llevar a cabo. Cuando se cierra la llave, podemos utilizar, si queremos probar otra condición o si queremos llevar a cabo alguna otra operación extra sin necesidad de probar condición. Un else sin un if, o un else con un if si es necesario. Otra forma que es muy común de usar en R, es hacer la asignación del if a un objeto. ¿Eso qué significa? Que cualquier valor que te vaya a regresar ese if, o sea, si saliendo de ese bloque te regresa algún valor, porque tiene que salir algún valor. Ese valor se asigna directamente a una variable. Esto con el fin de que quede claro que el valor de esa variable depende justamente de ese bloque if. Por supuesto, también podemos prescindir de la palabra especial else, cuando estamos utilizando una estructura de control if. Lo único que cambiarÃa es que el if se vuelve un completamente simple. La condición, si se cumple o no, si no se cumple, no entra a nada y no hace nada de lo del cuerpo del if, y si sÃ, se lleva a cabo. Esto es muy común también utlizarlo. La siguiente estructura de control que vamos a aprender es el for. El for para lo que nos sirve es un bucle de repetición. Lo que se usa es utilizar la palabra especial for. Se abre un paréntesis con algo en medio y luego se abre y se cierran las llaves donde se lleva a cabo la operación. Que es justo lo que estamos viendo en pantalla. Es muy fácil ver lo que está haciendo este ejemplo. Porque lo que está haciendo es tomar cada uno de los valores de i. Cuando va iterando el vector del uno al diez y luego vamos a imprimir ese valor. Ahora tendrÃamos entonces que explicar qué es lo que está sucediendo. Lo que está sucediendo es la forma general del for. En el for tenemos la palabra especial for, luego entre paréntesis ahora sà lo que es conocido como un generador de rango. Y entre, en el cuerpo del for, las operaciones que estarÃamos llevando a cabo. Un generador de rangos no es más que una estructura que podrÃamos ir recorriendo uno a uno. Entonces el valor del objeto que está tomando los valores del generador de rango. Va tomando justamente esos valores y los va utilizando o nos pueden servir dentro de la estructura for para llevar a cabo alguna tarea. A veces, muchas veces solamente es necesario poner el número, o sea el número de veces que queremos que se lleven a cabo esas repeticiones y con eso es suficiente. Muchas veces, también requerirÃamos hacer otras cosas. Como pueden observar en este primer ejemplo. Podemos generar un vector llamado mis_letras que es un vector de caracteres donde son las letras a,b,c y d. Entonces podemos utilizar este como un generador de rangos. Para el objeto letras, es decir, en cada paso del for que vaya tomando, letras va a ir tomando, los valores de vector mis_letras. Es decir, que en cada uno de ellos de va a ir imprimiendo la letra primero a, luego b, luego c y luego d. Esto también se puede hacer de diferentes maneras. Es decir imprimir cada uno de los elementos del vector mis_letras. En este caso, en este segundo ejemplo que estamos viendo en pantalla, utilizamos entonces la función seq_along. Ésta lo que hace es, genera un vector donde los elementos van a ser los enteros que van apareciendo dentro del vector mis_letras. Prácticamente lo que hace es generar un vector del 1 al 4. Una vez que you tomó estos elementos del 1 al 4. Cuando vamos imprimiendo, en vez de imprimir letras, osea la función tal cual. Vamos imprimiendo el vector mis_letras, pero de manera indexada, como you lo hemos hecho antes con el operador de corchetes. En este último ejemplo, que es equivalente al anterior. Estamos también otra vez formando un generador de rangos, igualito al que tenÃamos en el ejemplo anterior. En este caso, en vez de utilizar sec along, que lo que genera es toda la secuencia del vector, o sea el vector 1, 2, 3, 4. Lo que hacemos es, decimos, el primer número de la secuencia va a ser 1, ponemos dos puntos, como cuando generamos secuencias. Y luego ponemos lenght, de mis_letras. Que lo que hace esta función, es encontrar el tamaño del vector mis_letras. Como es 4, entonces nos va a generar, del 1 al 4, un vector del 1 al 4. Y vamos a ir entonces imprimiendo el vector mis_letras, utilizando el operador corchetes. For, también funciona con las siguientes estructuras. Por ejemplo un vector de números. En este ejemplo que estamos observando en pantalla, lo que estamos haciendo es tomar un vector, del 1 al 100. Pero en vez de estar yendo entero por entero. Es decir, uno, dos, tres, cuatro, asà hasta el cien, lo que estamos haciendo es caminando en incrementos de punto cinco por punto cinco, es decir, uno, uno punto cinco, dos, dos punto cinco, tres y asà sucesivamente hasta llegar al cien. Por supuesto también podemos utilizar este vector para generar nuestro rango que tomará los valores de la variable i. Dentro de nuestro for. También podemos formar bucles anidados, es decir podemos poner un for anidado dentro de otro for. ¿Esto para qué nos puede servir?. Generalmente lo necesitamos cuando queremos ir recorriendo todos los elementos de una matriz o de un data frame, por ejemplo. Como podemos ver en pantalla. Estamos generando una matriz del 1 al 18, de 3 por 3 y lo que estamos observando es que estamos recorriendo la matriz una por una. Si ejecutan este código que están viendo en pantalla podrán ver que lo que estamos imprimiendo es uno por uno, los elementos de esa matriz. Recuerden como los elementos de nuestra matriz, se van llenando de izquierda a derecha y de arriba abajo, van a ir apareciendo en ese orden. Es importante que tomen en cuenta que no hay abusar del uso de los bucles anidados. ¿Esto por qué? Porque genera mucha complejidad en el código. Y entre más bucles anidados vayan generando, más difÃcil de entenderlo será. Lo que les recomiendo es que vayan haciendo tal vez bucles anidados, de dos en dos, para que no se pierdan entre tanto código. La siguiente estructura que vamos a aprender es el while. Aunque antes de eso vamos a hacer un poquito de revisión de lo que significa el for. En el for, por ejemplo, sabemos a priori cuantos pasos se van a llevar a cabo. Es por eso que siempre sabemos el tamaño del vector donde se van generando los rangos. En el caso de un while no necesariamente sabemos ésto. Es por eso que, mientras, que es lo que significa la palabra while en inglés, se cumpla la condición, el cuerpo del while. Va a ser ejecutado. Por ejemplo, lo que estamos viendo en pantalla. Generamos primero una variable llamada contador, esta comienza en cero. La condición, es que este contador sea menor a diez estrictamente. Entonces si entramos en el while, lo primero que hace es imprimir el valor de contador. Y luego aumentarle en dos al valor que tiene actualmente. Una vez que haga eso, vuelve a entrar al while para probar la condición. Y asà va a ir haciendo la impresión y la suma esta de dos en dos. Es decir, nos va a acabar imprimiendo 0, 2, 4, asà hasta 8. Porque la condición es estrictamente menor a 10. While, también puede tener más de una condición y estas pueden ser conectadas dentro de los paréntesis por medio de operadores lógicos. En este caso estamos usando el operador lógico &. Que se escribe &&, como you hemos anteriormente. En este caso, lo que estamos pidiendo es que el valor de la variable a siempre esté entre 3 y 10. Mientras esté entre esos valores, lo que está dentro de nuestro cuerpo del while, se va a ejecutar. Este ejemplo que están viendo en pantalla, lo van a ejectuar en su computadora en la práctica. Y observarán que lo que genera es una caminata aleatoria. La siguiente estructura que vamos a aprender a utilizar es la combinación de repeat y break. Repeat lo que hace es entra directo al bucle, sin preguntar si se puede o no hacer. Y una vez adentro, nosotros podemos preguntar por medio de if, si la condición se cumple o no. Si la condición se cumple. Entonces puede llevar a cabo lo que queremos que lleve a cabo, las operaciones. O en caso contrario, también podemos utilizar un break para romper ese bucle y continuar con el camino del flujo del programa. Puede llegar a suceder que la condición para romper el repeat nuncla se cumpla. Entonces, ésto puede generarnos un bucle infinito. Debemos tener cuidado con ésto, al igual que cuando estemos utilizando un bucle while. Si la condición En el bucle while siempre se cumple. Entonces, puede llegar a pasar que también estemos dentro de un bucle infinito. Generalmente vamos a aprender a usar la palabra next, que se usa generalmente para saltarse los pasos de algún bucle. Por ejemplo, en una estructura de control for. Como la que tenemos en pantalla. Lo que podemos observar es que estamos iterando sobre un vector que va del 1 al 100. Si nos quisiéramos saltar los primeros 20 valores de ese vector. Lo único que hacemos es probar para i y si esta i es menor que 20, entonces nos la vamos saltando. Poniendo, por supuesto, una estructura if dentro de ese for para poder ir haciendo eso. Una vez que tenemos nuestro if, osea nuestra condición, ponemos en el cuerpo del if la palabra next. Y lo único que hará es saltar para volver a entrar al siguiente ciclo del for. you para finalizar esta lección, tenemos que recordar 3 cosas. If, while y for, son las estructuras de control que nos sirven para controlar el flujo de un programa en R. También debemos evitar el poder generar bucles infinitos. Esto nos puede ocasionar problemas. Y finalmente, utilizar estas estructuras de modo interactivo, puede ser un poco complicado. No lo dijimos de manera explÃcita, pero para evitarnos ésto, podemos utilizar la familia de funciones conocidas como apply. [MUSIC]