Capitulo 10 Funciones en R

La instalación base de R tiene suficientes funciones para que realicemos todas las tareas básicas de análisis de datos, desde importar información hasta crear documentos para comunicarla (¡este libro ha sido creado con R!).

Sin embargo, es común que necesitemos realizar tareas para las que no existe una función específica o que para encontrar la solución necesitemos combinar o utilizar funciones en sucesión, lo cual puede complicar nuestro código.

Ilustremos lo anterior con un ejemplo.

10.1 Funciones definidas por el usuario

Una función tiene un nombre, argumentos y un cuerpo. Las funciones definidas por el usuario son creadas usando la sigiente estructura.

nombre <- function(argumentos) {
  operaciones
}

Cuando asignamos una función a un nombre decimos que hemos definido una función.

El nombre que asignamos a una función nos permite ejecutarla y hacer referencia a ella. Podemos asignar la misma función a diferentes nombres o cambiar una función a la que ya le hemos asignado un nombre. Es recomendable elegir nombres claros y descriptivos, no ambiguos.

Una vez que la función tiene nombre, podemos llamarla usando su nombre, al igual que con las funciones por defecto de R.

Los argumentos son las variables que necesita la función para realizar sus operaciones. Aparecen entre paréntesis, separados por comas. Los valores son asignados al nombre del argumento por el usuario cada vez que ejecuta una función. Esto permite que usemos nuestras funciones en distintas situaciones con diferentes datos y especificaciones.

Los argumentos pueden ser datos, estructuras de datos, conexiones a archivos u otras funciones y todos deben tener nombres diferentes.

El cuerpo de la función contiene, entre llaves, todas las operaciones que se ejecutarán cuando la función sea llamada. El cuerpo de una función puede ser tan sencillo o complejo como nosotros deseemos, incluso podemos definir funciones dentro de una función (y definir funciones dentro de una función dentro de otra función, aunque esto se vuelve confuso rápidamente).

Si el código del cuerpo de la función tiene errores, sus operaciones no se realizarán y nos será devuelto un mensaje de error al ejecutarla. R no avisa si nuestra función va a funcionar o no hasta que intentamos ejecutarla.

Una ventaja de usar RStudio es que nos indica errores de sintaxis en nuestro código, lo cual puede prevenir algunos errores. Sin embargo, hay alguno que no detecta, como realizar operaciones o coerciones imposibles.

Para ver esto en acción, crearemos una función sencilla para obtener el área de un rectángulo.

10.2 Nuestra primera función

El área de un rectángulo es lado1 * lado2.

Podemos convertir esto a operaciones de R y asignarlas a una función llamada area_cuad de la siguiente manera:

area_cuad <- function(lado1, lado2) {
  lado1 * lado2
}

Las partes de nuestra función son:

  • Nombre: area_cuad.
  • Argumentos: lado1, lado2. Estos son los datos que necesita la función para calcular el área, representan el largo de los lados de un rectángulo.
  • Cuerpo: La operación lado1 * lado2, escrita de manera que R pueda interpretarla.
area_cuad(lado1 = 2, lado2 = 3)
## [1] 6
area_cuad(3,3)
## [1] 9

En cada llamada a nuestra función estamos asignando valores distintos a los argumentos usando el signo de igual. Si no asignamos valores a un argumento, se nos mostrará un error:

area_cuad(lado1 = 14)
## Error in area_cuad(lado1 = 14): el argumento "lado2" está ausente, sin valor por omisión

También podemos escribir funciones en base a otras funciones:

precio_area = function(lado1,lado2,precio){
        area_cuad(lado1,lado2)*precio
}
precio_area(2,3,100)
## [1] 600

10.3 Sacar varios resultados en una función

Si queremos obtener varios resultados de una función, debemos de usar una lista para ello list()

precio_area = function(lado1,lado2,precio){
  area=area_cuad(lado1,lado2)
  precio_area = area*precio
}
precio_area(2,3,100)

NO saca nada! —– hay que usar una lista

precio_area = function(lado1,lado2,precio){
  area=area_cuad(lado1,lado2)
  precio_del_area = area*precio
  list(area=area,precio_del_area=precio_del_area)
}
precio_area(2,3,100)
## $area
## [1] 6
## 
## $precio_del_area
## [1] 600

10.4 Ejercicios