Clase 3

Anuncio
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
Descargar