8.4 Definiendo la función crear_histograma()
Definiremos una función con el nombre crear_histograma()
para generar un gráfico con las especificaciones que se nos han pedido.
Partimos de una función sin argumentos y el cuerpo vacio.
crear_histograma <- function() {
}
Para que esta función realice lo que deseamos necesitamos:
- Los datos que serán graficados.
- El nombre de la variable graficada
Por lo tanto, nuestros argumentos serán:
datos
nombre
crear_histograma <- function(datos, nombre) {
}
Ya sabemos las operaciones realizaremos, sólo tenemos que incluirlas al cuerpo de nuestro función.
Reemplazaremos las variables que hacen referencia a un objeto en particular por el nombre de nuestros argumentos. De esta manera será generalizable a otros casos.
En este ejemplo, cambiamos la referencia a la variable edades por referencias al argumento datos
y la referencia a Edades, que usaremos como título del histograma, por una referencia al argumento nombre
.
crear_histograma <- function(datos, nombre) {
media <- mean(datos)
desv_est <- sd(datos)
hist(datos, main = nombre, xlab = "Datos", ylab = "Frecuencia", col = "gold")
abline(v = media, col = "red")
abline(v = media + (desv_est * c(1, -1)), col = "blue")
}
Probemos nuestra función usando datos distintos, generados de manera similar a las edades, con la función rnorm()
.
Generaremos datos de ingreso, con una media igual a 15000 y una desviación estándar de 4500.
ingreso <- rnorm(1500, mean = 15000, sd = 4500)
# Resultado
ingreso[1:10]
## [1] 14365.18 16621.70 13712.35 21796.08 14226.73 13830.29 22187.37
## [8] 17879.22 11040.41 17923.13
Corremos nuestra función.
crear_histograma(ingreso, "Ingreso")
Luce bien. Probemos ahora con datos sobre el peso de las personas. siguiendo el mismo procedimiento.
peso <- rnorm(75, mean = 60, sd = 15)
crear_histograma(peso, "Peso")
Las funciones definidas por el usuario pueden devolvernos errores. Por ejemplo, si introducimos datos que no son apropiados para las operaciones a realizar, nuestra función no se ejecutará correctamente.
crear_histograma("Cuatro", ingreso)
## Warning in mean.default(datos): argument is not numeric or logical:
## returning NA
## Warning in var(if (is.vector(x) || is.factor(x)) x else as.double(x), na.rm
## = na.rm): NAs introducidos por coerción
## Error in hist.default(datos, main = nombre, xlab = "Datos", ylab = "Frecuencia", : 'x' must be numeric
Por esta razón es importante crear documentación para las funciones que hayas creado. Puede ser tan sencilla como una explicación de qué hace la función y qué tipo de datos necesita para realizar sus operaciones.
La primera persona beneficiada por esto eres tu, pues tu yo de un mes en el futuro puede haber olvidado por completo la lógica de una función específica, así que la documentación es una manera de recordar tu trabajo.
Una manera simple de documentar tus funciones es con comentarios.
# crear_histograma
# Devuelve un histograma con lineas indicando la media y desviación estándar de un vector de datos numérico
# Argumentos:
# - datos: Un vector numérico.
# - nombre: Una cadena de texto.
8.4.1 Ejecutando
Ahora, podremos cumplir con la solicitud de nuestro jefe ficticio usando cincuenta llamadas a una función en lugar de correr más de cuatrocientas líneas de código y que hemos reducido la probabilidad de cometer errores.
Además, si a nuestro jefe se le ocurren nuevas características para los histogramas, basta con cambiar el cuerpo de nuestra función una vez y esto se verá reflejado en nuestro cincuenta casos al correr de nuevo el código.
Por ejemplo, supongamos que nuestro jefe también quiere que el histograma muestre la mediana de nuestros datos y que las barras sean de color naranja. Basta con hacer un par de cambios.
crear_histograma <- function(datos, nombre) {
media <- mean(datos)
desv_est <- sd(datos)
mediana <- median(datos)
hist(datos, main = nombre, xlab = "Datos", ylab = "Frecuencia", col = "orange")
abline(v = media, col = "red")
abline(v = media + (desv_est * c(1, -1)), col = "blue")
abline(v = mediana, col = "green")
}
# Resultado
crear_histograma(peso, "Peso con mediana")
Quizás estés pensando que escribir una función cincuenta veces de todos modos es demasiada repetición y aún se presta a cometer errores. Lo cual es cierto, pero podemos hacer más breve nuestro código y menos susceptible a equivocaciones con la familia de funciones apply, que revisaremos en el capítulo 10.