3.6 Digresión: creación de funciones

Esta sección, por su importancia, altera el flujo del libro. Lo que contiene pertenece propiamente a la sección de programación. Pero, dada la importancia de la creación de funciones en lo que sigue (y, en particular, para la sección siguiente), presenta lo que será estrictamente necesario para los capítulos intermedios.

En R hay miles de funciones que pueden aplicarse a un vector. Unas cuantas de las más comunes que pueden aplicarse a vectores númericos son:

fivenum(x)   # los "cinco números característicos" de un vector
mean(x)
max(x)
median(x)
sum(x)
prod(x)    

Sin embargo, por muchas funciones que tenga R para operar sobre vectores, seguramente falta aquella que resolvería un problema dado: por ejemplo, no existe una función de serie en R que sume los cuadrados de unos números. De necesitarla, podríamos crearla así:

x <- 1:10
suma_cuadrados <- function(x) sum(x*x)
suma_cuadrados(x)
## [1] 385

El código anterior crea una nueva función, suma_cuadrados, que suma los cuadrados de un vector. La nueva función es un objeto más de R18, que aparece en la pestaña Environment de RStudio y en los listados de ls(). Queda en memoria para ser utilizada posteriormente.

Si no existiese prod se podría programar: usa log, exp y sum para crear una función, mi.prod que multiplique los elementos de un vector (de números, por el momento, \(&gt; 0\)).

Crea una función que cuente el número de valores negativos (<0) del vector que se le pase como argumento.

Por supuesto, a menudo queremos crear funciones que no se resuelvan en una única línea, como la de arriba. Cuando el cuerpo de la función sea más complejo, hay que encerrarlo en llaves, {}.

media <- function(x){
 longitud <- length(x)
 suma <- sum(x)
 suma / longitud
}

En R, a diferencia de otros lenguajes como Python, no es necesario el return. Una función devuelve siempre el último valor definido en su cuerpo. No obstante, como veremos después, return existe y es muy útil en algunos contextos.


  1. Esta es una característica de R que lo distingue de algunos otros lenguajes de programación que distinguen estrictamente entre lo que son datos y lo que son funciones; en R, sin embargo, una función es un objeto más.