Crea tu propia función en R paso a paso

Crea tu propia función en R paso a paso

nov´17 Rosana Ferrero 6 comentarios

Una de las grandes ventajas de R es que permite al usuario crear sus propias funciones y así ampliar sus funcionalidades.

 Todo lo que queramos que ocurra en R debemos realizarlo con funciones, existentes o propias, de ahí la importancia de este tema.

Para entender la programación en R, hay dos claves útiles:

1. Todo lo que existe es un objeto.

2. Todo lo que ocurre deriva de una función que lleva a la acción.

John Chambers

¿Cuál es la estructura de una función?

ÚLTIMAS PLAZAS EN MASTERS

Máster Data Science

CONVOCATORIA ABIERTA I Logra la máxima precisión y rigor en tus proyectos de Ciencia de Datos.

Ver convocatorias 2022

MAster en MAchine learning

CONVOCATORIA ABIERTA | Automatiza procesos y crea tus propios algoritmos de Machine Learning.

Ver convocatorias 2022
 

En una función tenemos 3 tipos de elementos:

  1. Argumentos (o valores de entrada).
  2. Cuerpo: operaciones que han de realizarse. Se deben localizar entre corchetes "{}”.
  3. 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: 

Ejemplo 1. Función suma

suma<-function(x,y){ +     # suma de los elementos "x" e "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: 

suma(x=2,y=3) [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:

suma(2,3) [1] 5 > 5

Ejemplo 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) { +     # función que calcula x elevado a y +     result <- x^y +     paste(x,"elevado a la potencia de", y, "es", result) + } > potencia(2,3) [1] "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 > 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. > cat("María tiene\n", x, "hijos", "\b.") #\n divide la expresión en dos líneas María tiene 2 hijos.

Ejemplo 3. Función de valor absoluto con condicionales (if)

absoluto <- function(x) { +     # valor absoluto de x +     if(x<0){ -x } +     x + } > absoluto(-3) [1] 3 > absoluto(3) [1] 3

Aquí le estamos diciendo que si el valor de “x" es negativo nos devuelva su opuesto, en caso contrario que nos devuelva el valor original de "x”.

Ejemplo 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 +     } else { +         10 +     } + } > ftrozos(3) [1] 0 > ftrozos(5) [1] 10

Podemos utilizar funciones condicionales (if, while, etc.) dentro de la función.

Ejemplo 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) } + } > TMB("hombre",170,57,32) [1] 1479.3

En este caso le decimos a la función que calcule el TMB con una fórmula si el sujeto es mujer y otra si es hombre.  

Ejemplo 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) +     } > 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(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

 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) +     } > hipotenusa(2:4,4:6)   cateto1 cateto2 hipotenusa 1       2       4   4.472136 2       3       5   5.830952 3       4       6   7.211103

Ejemplo 7. Función return

También se puede utilizar la función “return()” para obtener el resultado de un paso en particular en la ejecución, no necesariamente el último. Es útil por ejemplo para identificar un error. 

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:

f<-function(x,y){ +     if(is.character(y)) "y debe ser numérico" +     x+y +     } > f(2,"hola") Error in x + y : argumento no-numérico para operador binario

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.

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:

  1. Crear el texto de la función y pegarlo en la consola.
  2. 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!

Lecturas complementarias

http://r-pkgs.had.co.nz/r.html https://google.github.io/styleguide/Rguide.html

6 comentarios

¹ Todos los campos son obligatorios.
² Tu correo electrónico no será publicado.

  • Muy buen aporte.

    Responder

    Roger Paguaga 15 de agosto de 2020, 17:29

    • ¡Gracias Roger!

      Responder

      Rosana Ferrero 17 de agosto de 2020, 11:36

  • Hola perdón por molestar, estoy perdida haciendo este ejercicio. Me pueden por favor ayudar.
    Estamos buscando a los mejores triatletas para formar un nuevo equipo. Hemos diseñado un sistema que puede establecer
    el rendimiento de la triatleta dependiendo del tiempo que necesite para completar los 2 km de natación, los 20
    km de ciclismo y los 10 km de carrera.
    El triatleta obtendrá «Alto Rendimiento» si el tiempo que necesita para completar la carrera y el ciclismo
    es inferior a 3000 segundos y el tiempo de la parte de natación es inferior a 2600 segundos. De lo contrario, si el
    el tiempo que necesita para completar la carrera y la parte de ciclismo es mayor que los anteriores 3000 pero menor que
    3200 segundos, y la parte de natación está entre 2600 y 2800, obtendrá «Rendimiento Medio». Si
    cualquiera de las marcas son más altas que estos últimos límites, el rendimiento será «Bajo rendimiento».

    1. Diseñe una función que implemente este sistema. La cabecera debe ser: calculate_performance <-
    función (natación, ciclismo, carrera)
    2. ¿Cuál es el rendimiento de un triatleta con 2500 segundos en natación, 3300 en ciclismo y 3000 en
    ¿Correr? Llama a la función para obtener la actuación.

    Por favor necesito una respuesta cuanto antes, muchas gracias!

    Responder

    marta 27 de diciembre de 2020, 11:52

    • Buenas Marta,
      sigue las instrucciones de este post con las reglas que te han dado para el ejercicio. Las variables natacion, ciclismo, carrera son los vectores de entrada que debes operar para obtener la variable respuesta «rendimiento» que es categórica (bajo, medio o alto).
      Saludos

      Responder

      Rosana Ferrero 28 de diciembre de 2020, 11:15

  • Genial la orientacion paso a paso ojala pudiera haber mas articulos sobre R paso a paso de analsis de regresion simple y multiple con interpretaciones. Gracias

    Responder

    Yony 15 de mayo de 2021, 14:29

    • Gracias por tu comentario Yony, lo tendremos en cuenta para próximas publicaciones.
      También te invito a participar en el «Curso de Análisis de correlación y regresión lineal con R» que comienza el 17 de mayo ¡Matrícula abierta!
      Saludos

      Responder

      Rosana Ferrero 17 de mayo de 2021, 14:22

Te llamamos

Introduce los siguientes datos y nos pondremos en contacto contigo para atender tus dudas sin compromiso.

Te llamamos

Muchas gracias por solicitar información.
Te contactaremos lo antes posible.

Diseño web: Albin Soft.