Introducción

R, en esencia, es un lenguaje funcional. Esto significa que tiene ciertas propiedades técnicas, pero lo más importante es que se presta a un estilo de resolución de problemas centrado en funciones. A continuación, daré una breve descripción de la definición técnica de un lenguaje funcional, pero en este libro me centraré principalmente en el estilo funcional de programación, porque creo que se adapta muy bien a los tipos de problemas comúnmente se encuentra al hacer análisis de datos.

Recientemente, las técnicas funcionales han experimentado un gran interés porque pueden producir soluciones eficientes y elegantes para muchos problemas modernos. Un estilo funcional tiende a crear funciones que pueden analizarse fácilmente de forma aislada (es decir, utilizando solo información local) y, por lo tanto, a menudo es mucho más fácil de optimizar o paralelizar automáticamente. Las debilidades tradicionales de los lenguajes funcionales, el rendimiento más bajo y, a veces, el uso impredecible de la memoria, se han reducido mucho en los últimos años. La programación funcional es complementaria a la programación orientada a objetos, que ha sido el paradigma de programación dominante durante las últimas décadas.

Lenguajes de programacion funcional

Cada lenguaje de programación tiene funciones, entonces, ¿qué hace que un lenguaje de programación sea funcional? Hay muchas definiciones de lo que hace que un lenguaje sea funcional, pero hay dos hilos comunes.

En primer lugar, los lenguajes funcionales tienen funciones de primera clase, funciones que se comportan como cualquier otra estructura de datos. En R, esto significa que puede hacer muchas de las cosas con una función que puede hacer con un vector: puede asignarlas a variables, almacenarlas en listas, pasarlas como argumentos a otras funciones, crearlas dentro de funciones y incluso devolverlos como resultado de una función.

En segundo lugar, muchos lenguajes funcionales requieren que las funciones sean puras. Una función es pura si cumple dos propiedades:

  • La salida solo depende de las entradas, es decir, si lo vuelve a llamar con las mismas entradas, obtendrá las mismas salidas. Esto excluye funciones como runif(), read.csv() o Sys.time() que pueden devolver valores diferentes.

  • La función no tiene efectos secundarios, como cambiar el valor de una variable global, escribir en el disco o mostrar en la pantalla. Esto excluye funciones como print(), write.csv() y <-.

Las funciones puras son mucho más fáciles de razonar, pero obviamente tienen desventajas significativas: imagine hacer un análisis de datos en el que no pueda generar números aleatorios o leer archivos del disco.

Estrictamente hablando, R no es un lenguaje de programación funcional porque no requiere que escribas funciones puras. Sin embargo, ciertamente puede adoptar un estilo funcional en partes de su código: no tiene que escribir funciones puras, pero a menudo debería. En mi experiencia, dividir el código en funciones que son extremadamente puras o extremadamente impuras tiende a generar un código que es más fácil de entender y se extiende a nuevas situaciones.

Estilo funcional

Es difícil describir exactamente qué es un estilo funcional, pero en general creo que significa descomponer un gran problema en partes más pequeñas y luego resolver cada parte con una función o combinación de funciones. Cuando usa un estilo funcional, se esfuerza por descomponer los componentes del problema en funciones aisladas que operan de forma independiente. Cada función tomada por sí sola es simple y fácil de entender; la complejidad se maneja componiendo funciones de varias maneras.

Los siguientes tres capítulos analizan las tres técnicas funcionales clave que lo ayudan a descomponer los problemas en partes más pequeñas:

  • El 9  Funcionales muestra cómo reemplazar muchos bucles for con funcionales que son funciones (como lapply()) que toman otra función como argumento. Los funcionales le permiten tomar una función que resuelve el problema para una sola entrada y generalizarla para manejar cualquier número de entradas. Los funcionales son, con mucho, la técnica más importante y los usará todo el tiempo en el análisis de datos.

  • El 10  Fábricas de funciones introduce fábricas de funciones: funciones que crean funciones. Las fábricas de funciones se usan con menos frecuencia que las funcionales, pero pueden permitirle dividir elegantemente el trabajo entre diferentes partes de su código.

  • El 11  Operadores de funciones le muestra cómo crear operadores de función: funciones que toman funciones como entrada y producen funciones como salida. Son como los adverbios, porque normalmente modifican el funcionamiento de una función.

En conjunto, estos tipos de funciones se denominan funciones de orden superior y completan una tabla de dos por dos: