5.1 Creación de funciones
La gran comunidad de desarrollo detrás de R ha creado una infinidad de funciones, almacenadas en los miles de paquetes (o librerías), disponibles en el repositorio oficial CRAN
, así como en repositorios secundarios (ver sección 1.6 Librerías y repositorios). Es casi seguro que más adelante te será útil crear funciones con las que suplir alguna necesidad en el análisis de datos. Cuando se detecta que algunas secuencias de órdenes se suelen repetir, crear una función que empaquete dicha secuencia permitirá automatizar procedimientos y simplificar el código. Como regla general, si copias y pegas una secuencia de órdenes para usarla más de 2 veces, ya se debería pensar en crear una función que compile la tarea.
Crear un función involucra los siguientes pasos:
- Darle un nombre. Crear una función es como crear una variable: hay que asignarle un contenido a un nombre.
- Luego de escribir el nombre, se tiene que usar la función llamada
function()
para indicar qué argumentos tendrá la nueva función. - Definir el contenido de la función, la secuencia de órdenes, dentro de corchetes. Dentro de ellos se usarán los argumentos establecidos en
function()
.
5.1.1 Ejemplo simple
Ejemplo 5.1 Comenzando con ejemplo muy simple, se creará una función que le sume 100 a un número dado:
### Modo 1:
### Crear la función con corchetes
<- function(x){
mi.fun1 +100
x
}
### Modo 2:
### Cuando el contenido de una función es muy sencillo,
### el contenido puede ir sin llaves y en una sola línea:
<- function(x) x+100
mi.fun2
### Ambas funciones brindan el mismo resultado
mi.fun1(156)
# [1] 256
mi.fun2(156)
# [1] 256
5.1.2 Función de Gauss
Ejemplo 5.2 Recrear la famosa función de Carl Friedrich Gauss para calcular la suma de todos los números dentro de un rango numérico, implicar tomar su fórmula matemática:
\[ k = \frac{n * ( n + 1 )}{2} \]
y convertirla en código funcional:
### Crear la función
<- function(n) {
k.Gauss * (n+1))/2
(n
}
### Usar la función
k.Gauss(100)
# [1] 5050
5.1.3 Variables y valores por defecto
Esa letra o palabra que se ha colocado dentro de la función function()
recibe el nombre de variable de la función. Hasta aquí se definió una única variable dentro de cada función: x
para mi.fun1()
y mi.fun2()
, o n
para k.Gaus()
. Pero se puede colocar más de una, e incluso definir valores por defecto en function()
, mismos que se podrán modificar al usar la función ya creada.
Ejemplo 5.3 La siguiente función permitirá hallar el logaritmo en base 2 (definido por defecto) de la función matemática de Gauss, pero podrás modificar el valor cuando quieras posteriormente:
### Crear la función
<- function(n, base = 2) {
log.Gauss <- (n * (n+1))/2
resultado.Gauss <- log(resultado.Gauss, base=base)
logaritmo return(logaritmo)
}
### Usar la función
log.Gauss(100)
# [1] 12.3
### Cambiando la base del logaritmo
log.Gauss(100, base = 10)
# [1] 3.703
### En casos como estos, donde la posición
### de un argumento es única, puedes obviar
### el nombre del mismo (base)
log.Gauss(100, 10)
# [1] 3.703
5.1.4 Almacenar variables directamente en el ambiente
Como es evidente en el ejemplo anterior, se pueden crear variables dentro de una función utilizando el operador <-
, pero estas son de carácter temporal. Una vez se imprime el resultado en consola, la variable temporal desaparece. Para que algún paso realizado dentro de una función se guarde como un objeto permanentemente en el ambiente, usa el símbolo especial <<-
.
Ejemplo 5.4 En el siguiente ejemplo permitiremos que un paso de la función log.Gauss()
se guarde en el ambiente:
### Crear la función con guardado especial
<- function(n, base = 2) {
log.Gauss <<- (n * (n+1))/2 # Este objeto se guardará
resultado.Gauss <- log(resultado.Gauss, base=base)
logaritmo print(logaritmo)
}
### Usar la función
log.Gauss(100, base = 5)
# [1] 5.298
### Mostrar el objeto resultado.Gauss que se creó
### automáticamente tras ejecutar log.Gauss()
print(resultado.Gauss)
# [1] 5050