[MUSIC] En esta lección aprenderemos las reglas de alcance, que son la principal diferencia entre el lenguaje R y el lenguaje S. Las reglas de alcance determinan como se asocia un valor con una variable libre en una función en R. Las variables libres no son más que variables que no aparecen en la lista de argumentos formales de una función. R, en particular, utiliza el alcance léxico. Por ejemplo en el código que está apareciendo en pantalla podemos observar que está definida la función funcion1. Y tiene como argumentos X y Y. Podemos observar que hay un valor dentro de la función, del cuerpo de la función donde se suma X, Y y otra variable Z. Esa Z es una variable libre. ¿Como sabe R qué valor asignar a un símbolo? Por ejemplo, sabemos que existe una función llamada lm dentro del paquete stats. ¿Qué pasaría entonces si definimos una función que le llamemos de la misma manera? lm. Si esta función con exáctamente el mismo nombre. ¿Qué creen ustedes que pasaría? Por ejemplo, la función lm que estoy definiendo en el código que está apareciendo en pantalla, lo único que hace es, recibe un parámetro X y regresa el valor de esa X al cuadrado. Si mandamos a llamar inmediatamente en nuestra consola a la función lm con un valor, digamos cuatro, el resultado es 16. Es decir, está utilizando el valor de la función lm que nosotros acabamos de definir. Cuando R trata de ligar un valor a un símbolo lo que hace es hacer una búsqueda en una serie de ambientes para encontrar el valor apropiado. Cuando estamos trabajando en la línea de comandos y queremos traer el valor de un objeto, el orden en el que se busca es el siguiente. Primero busca en el ambiente global por un símbolo con el nombre que se está solicitando. Luego busca en los espacios de nombres, en la lista de búsqueda. La lista de búsqueda la podemos consultar utilizando la función search. El ambiente global siempre es el primero en la lista de búsqueda y el paquete base siempre es el último en la lista de búsqueda. El orden de los paquetes en la lista es el orden en el que se hará la búsqueda. Los usuarios pueden configurar los paquetes que se cargan al iniciar. Por lo que no podemos suponer que habrá una lista de paquetes disponibles siempre. Cuando cargamos un paquete con la función library, el espacio de nombres de este paquete quedará en segundo lugar en la lista de búsqueda. Y todos los demás paquetes se irán un lugar hacia abajo. Hay que notar que R tiene un espacio de nombres específico para funciones y para cualquier cosa que no sea una función. ¿Esto que significa? Que por ejemplo podemos tener una función que you hemos utilizado llamada C, que nos puede ayudar a crear vectores. Y también un objeto llamado C que puede tener un valor. Como lo que estamos viendo en pantalla. Recuerdan este ejemplo que está apareciendo en pantalla. La función Z era una variable libre. ¿Qué pasaría si ejecutáramos ese código? Si mandamos a llamar a la función1 con los argumentos uno y dos, y. Como la variable Z no está definida, nos mandará un error, que nos dice que la Z no se encuentra. Pero si definimos Z anteriormente, y luego volvemos a hacer una llamada a la función1, con los argumentos unidos, nos regresará ocho. Esto significa que el valor de Z dentro de la función es el valor que encuentra primero, es decir, en el ambiente global, que es donde se definió que Z vale cinco. Y ese es justamente de lo que trata el alcance léxico, que es que los valores de las variables se buscan en el ambiente en el que la función fue definida. Un ambiente no es más que una colección de parejas de símbolos y valores asociados a esos símbolos. Cada ambiente tiene un ambiente padre y es posible que un ambiente tenga múltiples ambientes hijos. El único ambiente que no tiene padre, es el ambiente vacío. SI el valor de un símbolo no se encuentra en el ambiente en el que la función fue definida, se busca en el padre, y así hacia arriba hasta el llegar al nivel más alto, es decir, generalmente el ambiente global. O el espacio de nombres de un paquete. Después de llegar al nivel más alto, se continúa hasta llegar al ambiente vacío. Si el valor de un símbolo no es encontrado en un ambiente antes de llegar al ambiente vacío, entonces se va a encontrar con un error, que es justo lo que pasó con el ejemplo que observamos al principio. Esto típicamente no tendría mucho sentido, pero en R, nosotros podemos definir funciones dentro de otras funciones. En este caso, el ambiente de una función es justamente el cuerpo de otra. Por ejemplo la función que estamos observando en pantalla en este momento, llamada elevar.potencia recibe un parámetro n. Y dentro de ella se define otra función que utiliza ese parámetro para generarnos una función. Es decir, que lo que regresa esa función es una función también. Vamos a ver cómo funciona. Por ejemplo, si mandamos a llamar la función elevar.potencia con diferentes parámetros. Y guardamos en diferentes objetos el resultado de esas ejecuciones de la función elevar.potencia, podemos observar que esos objetos que guardan el resultado de esas llamadas. También, a su vez, son funciones pero que hacen una función en específico, es decir, una eleva a la cuarta y la otra eleva al cuadrado. Podemos ver que estos objetos en realidad son funciones también. Podemos ver de manera más clara qué es lo que está sucediendo con los siguientes comandos. La función ambiente o enviroment nos permite analizar qué hay en el ambiente en donde está definida en la función que le pasamos a environment. Entonces, si usamos ls(environment(alacuarta)), que es uno de los objetos que definimos cuando hicimos la llamada. Podemos ver que hay dos objetos, m y pow, al igual que con el ambiente de alcuadrado. También existe "n" y "pow", pero si mandamos a llamar con la función get, el valor del nombre n podemos ver que en un ambiente tiene un valor 4 y en el otro tiene valor de 2. Es por eso que cuando se mandan a llamar los respectivos objetos con un argumento en uno elevará a la cuarta y en otro eleva al cuadrado. Es importante no olvidar la manera en que R lleva a cabo la evaluación y las reglas de alcance, esto nos servirá a escribir código más claro y conciso. Es importante y creo que en este momento you es un poco obvio. Que no se repitan los nombres de variables o de funciones, you que esto puede causar confusión si no estamos en el contexto correcto, o si no tenemos total conocimiento del código que estamos modificando. Finalmente, siempre es importante tomar en cuenta esto cuando vayamos a modificar el código de alguien mas. [MUSIC]