INGENIERÍA EN ESTADÍSTICA

REALIZAR LOS 7 EJEMPLOS DESCRITOS EN LA LECTURA SIGUIENTE:

En una función tenemos 3 tipos de elementos:
Argumentos (o valores de entrada).
Cuerpo: operaciones que han de realizarse. Se deben localizar entre corchetes “{}”.
Resultado (o valores de salida): la última expresión que se ejecuta.
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:

EJERCICIO 1. FUNCIÓN SUMA

suma <- function(x, y) {
  x + y
}

# La última operación evaluada es el valor que ha de retornar la función 
# (también llamada salida).
# Por ejemplo, si evaluamos la función para los valores x=2 e y=3 obtenemos:

resultado1 <- suma(x = 2, y = 3)
print(resultado1)  
## [1] 5
# También podemos omitir los nombres de los argumentos si mantenemos
# la correspondencia con el orden o posición de los argumentos en el 
# que damos los valores:

resultado2 <- suma(2, 3)
print(resultado2) 
## [1] 5

EJERCICIO 2. FUNCIÓN POTENCIA CON PASTE Y CAT

# Cuando queremos que el resultado de una función contenga texto podemos 
# utilizar las función paste().

potencia <- function(x, y) {
  result <- x^y
  mensaje <- paste(x, "elevado a la potencia de", y, "es", result)
  cat(mensaje) 
}

# Función "potencia" con los argumentos x=2 e y=3
potencia(2, 3)  
## 2 elevado a la potencia de 3 es 8
# También podemos utilizar la función cat(), que tiene mayor versatilidad.
# Por ejemplo:
x <- 2
cat(x) 
## 2
cat("María") # María
## María
cat("María tiene", x, "hijos", ".")# María tiene 2 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 .

EJERCICIO 3. FUNCIÓN DE VALOR ABSOLUTO CON CONDICIONES (IF)

absoluto <- function(x) {
  if (x < 0) {
    -x  # Devuelve el opuesto si x es negativo
  } else {
    x  # Devuelve x si es no negativo
  }
}

# La función "absoluto" con argumento x=-3
resultado1 <- absoluto(-3)
print(resultado1)  
## [1] 3
# La función "absoluto" con argumento x=3
resultado2 <- absoluto(3)
print(resultado2)
## [1] 3

EJERCICIO 4. FUNCIÓN A TROZOS CON CONDICIONALES (IF)

# Función a trozos: si x es menor a 5 toma el valor 0 
# y en caso contrario el valor 10. 

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
  }
}

# Función "ftrozos" con argumento x=3
resultado1 <- ftrozos(3)
print(resultado1) 
## [1] 0
# Función "ftrozos" con argumento x=5
resultado2 <- ftrozos(5)
print(resultado2)
## [1] 10

EJERCICIO 5. CÁLCULO DE LA TASA DE METABOLISMO BASAL

# 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:

# TMB Mujer = 655 + (9,6 * P) + (1,8 * A) – (4,7 * E)
# TMB Hombre = 66 + (13,7 * P) + (5 * A) – (6,8 * E)

# 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
resultado_hombre <- TMB("hombre", 170, 57, 32)
print(resultado_hombre)  
## [1] 1479.3
# Función "TMB" con los argumentos para una mujer
resultado_mujer <- TMB("mujer", 170, 57, 32)
print(resultado_mujer) 
## [1] 1357.8

EJERCICIO 6. VARIAS FORMAS DE OBTENER RESULTADOS

# 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)
}

resultado1 <- hipotenusa(2, 4)
print(resultado1)  
## [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)
}

resultado2 <- hipotenusa(2, 4)
print(resultado2)
## $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:

resultado3 <- hipotenusa(2:4, 4:6)
print(resultado3)
## $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 el data.frame:

hipotenusa <- function(cateto1, cateto2) {
  h <- sqrt(cateto1^2 + cateto2^2)
  data.frame(variable = c("cateto", "cateto", "hipotenusa"),
             valor = c(cateto1, cateto2, h))
}

resultado4 <- hipotenusa(2, 4)
print(resultado4)
##     variable    valor
## 1     cateto 2.000000
## 2     cateto 4.000000
## 3 hipotenusa 4.472136
# Otra opción para presentar los resultados:

hipotenusa <- function(cateto1, cateto2) {
  h <- sqrt(cateto1^2 + cateto2^2)
  data.frame(cateto1 = cateto1, cateto2 = cateto2, hipotenusa = h)
}

resultado5 <- hipotenusa(2:4, 4:6)
print(resultado5)
##   cateto1 cateto2 hipotenusa
## 1       2       4   4.472136
## 2       3       5   5.830952
## 3       4       6   7.211103

EJERCICIO 7. FUNCIÓN RETURN

# Ejemplo de uso de la función return() para manejar mensajes de error:

f <- function(x, y) {
  if (is.character(y))
    return("y debe ser numérico")
  x + y
}

resultado1 <- f(2, "hola")
print(resultado1) 

# 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
}

# Función g con argumentos inválidos
# Esto resultará en un mensaje de error: "argumento no-numérico para operador binario"
resultado2 <- g(2, "hola")

Cuándo escribir una función:

Principalmente cuando no existe una función previa que realice las operaciones que necesitamos y en segundo lugar cuando necesitamos crear una función más eficiente.

Cómo empezar y qué tener en cuenta cuando escribes tu función:

Para poder ejecutar una función primero debes guardarla en la memoria. Ocurre lo mismo que al activar/cargar una librería/biblioteca, hasta que no lo hagas las funciones contenidas en ella no se pueden llamar/utilizar. Existen dos métodos para cargar funciones en la memoria:

Crear el texto de la función y pegarlo en la consola:

Utilizar la función “source()” para cargar funciones desde un archivo .R (puedes tenerlo en tu directorio o descargarlo desde la web).
La mejor opción es la segunda, por eso recomiendo crear tus funciones en un archivo .R con un nombre sencillo e intuitivo y guardarlo en su ordenador para llamarlo en el momento que desees. Por ejemplo:

source( “ mifuncion.R”) #desde tu directorio > # Para acceder a una función que se encuentra en la web > source(“https://raw.github.com/tonybreyal/Blog-Reference-Functions/master/R/bingSearchXScraper/bingSearchXScraper.R”)

Cómo conseguir una buena función:

Lo ideal es que la función sea corta y simple, con nombres intuitivos. El código debe ser fácil de escribir, fácil de leer y de utilizar, de rápida ejecución, con resultados confiables.

Cómo utilizar una función en R:

Las funciones en R se pueden tratar como cualquier otro objeto R. Se puede definir una función dentro de otra función, es decir, se puede utilizar como argumento para otras funciones o se pueden ejecutar desde otras funciones. Y ahora te toca a ti, juega con R y construye tu propia función. ¡Saludos!