En una función tenemos 3 tipos de elementos:
mifuncion <- function(argumento1, argumento2, …) { cuerpo resultado }
Las funciones también son objetos y por tanto les daremos un nombre, en este caso se llamará “mifuncion”. Debes evitar utilizar nombres que ya estén en uso en R, por ejemplo “mean”. Los argumentos se separan por una coma dentro de “función()”. Puede ser cualquier tipo y cantidad de argumentos. Los argumentos son los ingredientes que necesitas para que se ejecute la función. Los argumentos pueden tener un valor predeterminado, por ejemplo si escribimos argumento2=10:
mifuncion <- function(argumento1, argumento2=10, …) { cuerpo resultado }
El cuerpo de la función contiene las operaciones que deseamos que se ejecuten sobre cada uno de los argumentos detallados anteriormente. Vienen dados entre corchetes “{}” y se ejecutan cada vez que llamamos la función. El resultado es el valor devuelto por la función que se genera en las operaciones que se han ejecutado en el cuerpo de la función. Puede ser cualquier tipo de datos. La última línea del código será el valor que devolverá la función. Veamos algunos ejemplos:
suma <- function(x, y) {
x + y
}
suma(x=2,y=3)
## [1] 5
suma(2,3)
## [1] 5
potencia <- function(x, y) {
result <- x^y
mensaje <- paste(x, "elevado a la potencia de", y, "es", result)
cat(mensaje)
}
potencia(2, 3)
## 2 elevado a la potencia de 3 es 8
x <- 2
cat(x)
## 2
cat("María")
## María
cat("María tiene", x, "hijos", ".")
## María tiene 2 hijos .
cat("María tiene", x, "hijos", " \b.") #\b quita el último espacio María tiene 2 hijos.
## María tiene 2 hijos .
cat("María tiene \n", x, "hijos", "\b.") #\n divide la expresión en dos líneas María tiene 2 hijos.
## María tiene
## 2 hijos .
absoluto <- function(x) {
if (x < 0) {
-x # Devuelve el opuesto si x es negativo
} else {
x # Devuelve x si es no negativo
}
}
absoluto(-3)
## [1] 3
absoluto(3)
## [1] 3
ftrozos <- function(x) {
if (x < 5) {
0 # Devuelve 0 si x es menor que 5
} else {
10 # Devuelve 10 si x es mayor o igual a 5
}
}
ftrozos(3)
## [1] 0
ftrozos(5)
## [1] 10
La Tasa de Metabolismo Basal (TMB), es la cantidad mínima de energía que necesita tu cuerpo para funcionar. Nunca debemos ingerir menos cantidad de calorías de las que marca la tasa metabólica. La TMB se calcula siguiendo las siguientes ecuaciones
donde necesitamos información del Sexo, A=Altura, P=Peso y E=Edad de cada persona, nuestros argumentos.
TMB <- function(Sexo, Altura, Peso, Edad) {
if (Sexo == "mujer") {
655 + (9.6 * Peso) + (1.8 * Altura) - (4.7 * Edad)
} else {
66 + (13.7 * Peso) + (5 * Altura) - (6.8 * Edad)
}
}
Función “TMB” con los argumentos para un hombre
TMB("hombre", 170, 57, 32)
## [1] 1479.3
Función “TMB” con los argumentos para una mujer
TMB("mujer", 170, 57, 32)
## [1] 1357.8
Imagina que queremos calcular el valor de la hipotenusa de un triángulo a partir de los valores de sus catetos. Único valor. Si solo queremos obtener el valor de la hipotenusa:
hipotenusa <- function(cateto1, cateto2) {
sqrt(cateto1^2 + cateto2^2)
}
hipotenusa(2, 4)
## [1] 4.472136
Lista de valores. Si queremos que en el resultado se muestren los valores iniciales y finales:
hipotenusa <- function(cateto1, cateto2) {
h <- sqrt(cateto1^2 + cateto2^2)
list(cateto1 = cateto1, cateto2 = cateto2, hipotenusa = h)
}
hipotenusa(2, 4)
## $cateto1
## [1] 2
##
## $cateto2
## [1] 4
##
## $hipotenusa
## [1] 4.472136
Con más de un valor para cada cateto. Si queremos que el resultado tenga varios tipos de información (numérica o categórica) podemos utilizar una lista.
hipotenusa <- function(cateto1, cateto2) {
h <- sqrt(cateto1^2 + cateto2^2)
list(cateto1 = cateto1, cateto2 = cateto2, hipotenusa = h)
}
hipotenusa(2:4,4:6)
## $cateto1
## [1] 2 3 4
##
## $cateto2
## [1] 4 5 6
##
## $hipotenusa
## [1] 4.472136 5.830952 7.211103
Resultado como data.frame. Si queremos que el resultado sea de un mismo tipo pero con múltiples variables podemos utilizar eldata.frame.
hipotenusa <- function(cateto1, cateto2) {
h <- sqrt(cateto1^2 + cateto2^2)
data.frame(variable = c("cateto", "cateto", "hipotenusa"),
valor = c(cateto1, cateto2, h))
}
hipotenusa(2, 4)
## variable valor
## 1 cateto 2.000000
## 2 cateto 4.000000
## 3 hipotenusa 4.472136
hipotenusa <- function(cateto1, cateto2) {
h <- sqrt(cateto1^2 + cateto2^2)
data.frame(cateto1 = cateto1, cateto2 = cateto2, hipotenusa = h)
}
hipotenusa(2:4, 4:6)
## cateto1 cateto2 hipotenusa
## 1 2 4 4.472136
## 2 3 5 5.830952
## 3 4 6 7.211103
f <- function(x, y) {
if (is.character(y))
return("y debe ser numérico")
x + y
}
f(2, "hola")
## [1] "y debe ser numérico"
Si no utilizáramos la función return() obtendríamos un mensaje de error:
g <- function(x, y) {
if (is.character(y))
"y debe ser numérico"
x + y
}
NOTA: recuerda que si no se utiliza return de manera explícita en una función, el valor de la última expresión evaluada se devuelve automáticamente en el resultado de la función.