Programando con funciones Las funciones constituyen uno de los principales componentes de programas extensos pues constituyen herramientas esenciales para estructurar algoritmos complejos. Así como en otros lenguajes de programación los procedimientos y subrutinas juegan el mismo rol que las funciones en R. Funciones Una función tiene la forma nombre <- function(argumento_1, argumento_2, …) { expresión_1 expresión_2 … return(output) } Para llamar o ejecutar un programa se usa nombre(x1, x2, …) Ejemplo 10: Se presenta un programa para encontrar las raíces de una ecuación cuadrática: cuad3.r cuad3 <- function(a0, a1, a2) { discrim <- a1^2 - 4*a2*a0 if (discrim > 0) { raices <- (-a1 + c(1,-1) * sqrt(a1^2 - 4*a2*a0))/(2*a2) } else { if (discrim == 0) { raices <- -a1/(2*a2) } else { raices <- c() } } # Output if (length(raices) == 0) { cat("No existen raices reales\n") } else if (length(raices) == 1) { cat("La unica raiz es", raices, "\n") } else { cat("Las raices son", raices[1], "y", raices[2], "\n") } } > cuad3(1, 0, 1) No existen raices reales > cuad3(1, 0, -1) Las raices son -1 y 1 > cuad3(1, 2, 1) La unica raiz es -1 > cuad3(1, -2, -1) Las raices son -2.414214 y 0.4142136 > cuad3(0, 0, 0) La unica raiz es NaN Ejemplo 11: El número de formas en que se puede escoger r objetos de un total de n n! . El siguiente programa calcula el factorial ignorando el orden de selección es r !( n − r ) ! de n . fact <- function(n) { # Calcula el factorial de n factorial <- prod(1:n) return(factorial) } Este segundo programa utiliza la función anterior para calcular las combinaciones de r objetos de un total de n . combina <- function(n, r) { # Calcula las combinaciones de n en r comb <- fact(n)/(fact(r)*fact(n-r)) return(comb) } > combina(5,3) [1] 10 > combina(6,4) [1] 15 > combina(3,3) [1] Inf Programación basada en vectores usando funciones Para facilitar la programación basada en vectores R proporciona una familia de funciones flexibles y potentes que permiten usar las funciones definidas por el usuario: apply, sapply, lapply, tapply y mapply. El efecto de sapply(X, FUN) es aplicar la función FUN a cada elemento del vector X. > x <- 1:5 > sapply(x,fact) [1] 1 2 6 24 120 > sapply(x,combina,1) [1] Inf 2 3 4 5 > sapply(x,combina,2) [1] -Inf Inf 3 6 10 Si se desea aplicar una función a todas las filas o columnas de una matriz se usa apply. > (x <- matrix(1:24, nrow = 4, ncol = 6)) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 5 9 13 17 21 [2,] 2 6 10 14 18 22 [3,] 3 7 11 15 19 23 [4,] 4 8 12 16 20 24 > (suma.fila <- apply(x, 1, sum)) [1] 66 72 78 84 > (suma.col <- apply(x, 2, sum)) [1] 10 26 42 58 74 90