2.9 Creando nuestras funciones

Cuando necesitamos programar alguna tarea, que tenemos que realizar múltiples veces, para la cual no existe un función en los paquetes de R base o en paquetes importados, será necesario que definamos nuestras propias funciones.

Las funciones en R tienen tres componentes: nombre, parámetros y cuerpo. El nombre permite que ejecutemos la función el número de veces que la necesitemos. Los parámetros son las variables que existen dentro de la función y que tomarán el valor de los argumentos con los que esta se llamada y el cuerpo, es el conjunto de operaciones que se realizarán dentro de la función. Para declarar una función utilizamos la palabra reservada function. Su estructura es la siguiente:

nombre <- function(argumentos) {
  cuerpo
}

Los tres componentes dependen completamente de nosotras, las desarrolladoras, y de la tarea que estemos realizando. Aunque nuestras funciones pueden llegar a ser altamente complejas, la recomendación es que una función ejecute solamente una tarea.

Para definir una función que obtenga el área de un círculo, podemos declarla de esta forma

areaCirculo <- function(radio) {
  pi * radio^2 #pi es una constante ya definida en R
}

Y después ejecutarla con múltiples argumentos.

areaCirculo(10)
## [1] 314.1593
areaCirculo(2)
## [1] 12.56637

Debemos tener en cuenta que en R, las funciones regresan la última instrucción ejecutada, por lo que a veces es conveniente hacer uso explícito de la función return(), para indicar que ese es el valor que queremos que nuestra función regrese.

getStats <- function(vec) {
  mean_v <- mean(vec, na.rm = TRUE)
  sd_v <- sd(vec, na.rm = TRUE)
  med_v <- median(vec, na.rm = TRUE)
  var_v <- var(vec, na.rm = TRUE)
  na_vals <- sum(is.na(vec))
  
  all_stats <- list(media = mean_v, desv = sd_v, 
                    var = var_v, mediana =  med_v, 
                    num_nas = na_vals)
  return(all_stats)
}

Y la ejecutamos de la misma forma

stats1 <- getStats(c(23, 5, 24, 6, 24, NA, 33, 56, NA, 8))
stats1$num_nas
## [1] 2
stats2 <- getStats(1:10)
stats2$mediana
## [1] 5.5