Taller 13

Realizar los 7 ejemplos descritos en la lectura

Ejemplo 1. Función suma

    suma<-function(x,y){ 
      x+y}     
     
   ##  suma(x=2,y=3) [1] 5
   
     suma(2,3)
## [1] 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) { 
      x^y 
      paste(x,"elevado a la potencia de", y, "es", x^y)}
    
    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.")
## María tiene 2 hijos .
cat("María tiene\n", x, "hijos", "\n") 
## María tiene
##  2 hijos
#\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) {
  abs(x)
  }

  absoluto(3)
## [1] 3

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){
      cat(0) 
    }else{
      cat(10)
    }
  }
  
  ftrozos(20)
## 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",45,70,25)
## [1] 1080

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

$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){ 
    is(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"
    } else {
      x+y   
    }
  }
f(2,"hola")   
## [1] "y debe ser numérico"

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.