[MUSIC] En esta lección vamos a aprender cómo escribir funciones. Las funciones en R o prácticamente en cualquier lenguaje de programación son los bloques de construcción de análisis o programas más complejos. Las funciones se crean utilizando la función especial llamada function(). Y, una vez creadas, se guardan como un objeto de R con clase tipo "function". Estas se definen de la manera siguiente. Podemos ver en pantalla el esqueleto de una función de manera formal. Primero ponemos el nombre de la función, luego el operador de asignación y luego la palabra especial function. Entre paréntesis van a ir los argumentos de la función. O también a veces son conocidos como parámetros. Y, finalmente, en el cuerpo de la función, abriendo y cerrando llaves, tendremos todas las operaciones que lleva a cabo. Algo que es importante recordar es que el valor que genera una función, o que regresa una función, es el último o la última sentencia que está en el cuerpo de la función. Hay dos particularidades que son importantes en las funciones. La primera es que éstas pueden ser pasadas también como argumentos a otras funciones. Y la segunda es que pueden ser anidadas, es decir, dentro de una función podemos definir a otra función más pequeña. Cuando creamos funciones, podemos crearlas con varios argumentos. Estos argumentos o parámetros pueden incluso tener valores por omisión. Los argumentos formales son aquellos que aparecen incluidos en la definición de la función. Estos pueden ser consultados utilizando la función formals() cuando you se encuentra la función dentro del ambiente de la línea de comandos de R. Si utilizamos formals() y el nombre de la función que vamos a consultar, formals nos va a regresar una lista de todos los parámetros que tiene esa función. Es importante que tomen en cuenta que en R no es necesario pasar toda la lista de parámetros formales que tengamos. Esto por dos razones. Una, puede ser que ese parámetro no se esté utilizando. Para un análisis en particular o para una operación en particular. Y dos, puede ser que ese parámetro you tenga un valor por omisión. En R, cuando mandamos a llamar a una función para que se ejecute, podemos ir poniendo los parámetros por nombre, uno por uno. Pero, si no lo hacemos, R tiene manera de coincidir estos valores que estamos pasándole a la función de dos maneras: de manera posicional o directamente por el nombre, pero no necesariamente a todos. ¿Esto qué significa?, que los argumentos de R, siempre y cuando estén nombrados, le podemos cambiar el orden en el que están definidos. Esto puede ser un poco confuso por lo que no se lo recomiendo. Yo lo que generalmente hago es escribir los parámetros en el orden en el que deben de ir, o nombrar uno por uno para que haya absolutamente no confusión. Es importante recalcar que si decidimos cambiar el orden de los parámetros, no lo hagamos de manera seguida. Porque esto nos puede ocasionar mucha confusión en nuesto código. Es importante entonces recordar que hay tres tipos de argumentos coincidentes. El primero es una coincidencia exacta. El segundo es una coincidencia parcial, pues es decir, utilizando un nombre parcial de los nombres, así como you lo habíamos visto cuando la usamos con las listas o con los Data Frames. Y finalmente la coincidencia por posición. Por ejemplo, en el ejemplo que está apareciendo en pantalla, tenemos una variable llamada monedas. Ésta no es más que el valor del lanzamiento de una moneda. No tenemos que ver de qué trata la función rbinom, pero eso es justamente lo que está haciendo. Entonces, la variable monedas tiene 100 valores, y lo que queremos ver es el promedio de todos esos valores. Para eso utilizamos la función mean. Si mandamos a llamar mean(monedas), la función mean tiene como primer parámetro un vector X, que es sobre el cual vas a tomar ese valor promedio. En este caso como no mandamos a llamar a ningún otro parámetro, lo que hace es justamente sacarnos el valor promedio de ese vector. Ahora, también podemos mandar a llamar mean(x = monedas). Y nos va a hacer exactamente la misma operación que cuando mandamos a llamar solamente monedas sin nombrar a ese parámetro. ¿Por qué?, porque x es el valor o el nombre de ese parámetro que necesita la función mean de manera obligatoria. Hay otro parámetro llamado na.rm, esto lo que hace es: nos elimina los valores faltantes. Normalmente, el comportamiento de mean nos indica que na.rm siempre va a ser igual a false. Es decir, si nosotros lo ponemos ahorita al llamar a la función na mean y x=monedas y na.rm=FALSE va a ser exactamente lo mismo que en los dos ejemplos anteriores. Esto mismo puede pasar si cambiamos el orden de los parámetros. Si están nombrados no hay ningún problema, R entenderá que uno es un vector lógico y el otro es el vector al que le va a sacar el promedio. Que es lo que no pasa en este último ejemplo, donde na.rm=FALSE, pero el segundo parámetro no está nombrado. R lo que hace es: si tú nombras a un parámetro nombrado, los demás tratan de hacer los coincidentes de acuerdo a la posición. Entonces, en este caso, supone que monedas es el primer parámetro sin nombre que vas a poner que es exactamente el vector x. La manera en que se evalúan los argumentos en una función en R es conocida como "evaluación floja" o "lazy evaluation". ¿Esto qué significa? Esto significa que un argumento no es evaluado sino hasta el momento en que se necesita dentro de la función. Por ejemplo podemos observar en la función que tenemos definida en pantalla que pide dos parámetros: x y y, pero, dentro del cuerpo de la función, y nunca se utiliza. Es decir, si a la función cuando la llamamos, que es lo que podemos ver abajo, como argumento al valor 4. Lo único que hace es sumarle 1 a ese valor 4 y nos lo regresa. Y no nos genera ningún error. ¿Ésto porqué? Por que en ningún momento llegó a necesitar evaluar el segundo parámetro que era y. Ahora vamos a hablar del argumento Este argumento se utiliza si no sabemos a priori el número de parámetros que le vamos a pasar a una función. O si un número variable de argumentos se le va a pasar a otras funciones que existan dentro del cuerpo de esa función que se está definiendo. Las funciones genéricas también hacen uso del argumento "···". Estas funciones son funciones que, justo como su nombre lo dice, son de tipo genérico. Esto significa que pueden llevar a cabo esa operación que se supone hacen, pero sobre diferentes tipos de objeto. Por ejemplo, la función mean. Puedes llevar a cabo encontrar el valor de un promedio, pero no sólo en un vector, sino puede ser en otro tipo de objeto. you sea un Data Frame o una matriz, por ejemplo. En éste momento estamos observando la función mi_graficador. Que es una función que he definido y en donde hago uso, dentro de ella, de la función plot. Como la función plot tiene que recibir además parámetros extra, es entonces que nosotros utilizamos el argumento "···". En este último ejemplo, podemos observar el uso de la función "···". Primero vamos a analizar los argumentos que requiere la función paste. Utilizando la función args. Podemos ver que como primer argumento tiene el parámetro "···". La función paste lo único que hace es concatena cadenas de parámetros. En este caso lo que estamos observando es que solamente concatenamos la cadena "hola" y la cadena "mundo". Pero podríamos poner muchas más o sólo una. Es decir, no sabemos a priori, el número de argumentos que vamos a pasar. Es por eso que En la definición, en la función paste, usa los "···" de argumento. Finalmente como última anotación, para el parámetro "···". Es importante hacer notar que una vez que utilizamos el parámetro "···", cualquier parámetro que continúe después de él, tiene que ir nombrado explícitamente y no puede ser emparejado parcialmente. [MUSIC]