Está en la página 1de 11

Funciones

R
Noviembre 2020
Una función es un fragmento de código con un nombre asociado que realiza una serie de
tareas y devuelve un valor (incluso si este valor es NULL). Al definir una función se
especifica un nombre para este conjunto de sentencias y posteriormente se llamará a esta
función por ese nombre.
#Funciones internas de R R tiene una gran cantidad de funciones internas
como mean(), mode(), son(), etc. Además, al cargar un paquete de R tenemos desde ese
momento disponibles todas las funciones que lo componen.
Entre las funciones internas de R encontramos:

 Funciones matemáticas
 Funciones de distribuciones
 Funciones cadena
 Funciones de cuadro de datos
 etc.

#Funciones definidas por el usuario


Para definir una función es necesario especificar el nombre de la función y la secuencia de
sentencias que se ejecutan cuando esa función sea llamada. Una vez definida una función,
se puede reutilizar una y otra vez a lo largo de todo el programa. Una vez definida una
función esta puede llamarse como cualquier otra función de R.
R no diferencia entre una función escrita por un usuario y una función del propio R. Esto
permite personalizar las funciones de R y también desarrollar nuevas funciones
rápidamente. Como contrapartida, se realiza un uso intenso y según algunos autores no
muy eficiente de la memoria del ordenador
R dispone de una gran cantidad de funciones tanto en los paquetes que se pueden instalar
como funciones escritas por programadores como las creadas por el usuario. Las
funciones en R son objetos de primera clase, esto significa que son tratados como
cualquier otro objeto de R.
Características importantes de las funciones en R son:

 Las funciones pueden pasarse como argumentos de otra función.


 Las funciones pueden anidarse (se puede definir una función dentro de otra
función).
 El valor que devuelve una función es la última expresión evaluada dentro del
cuerpo de la función.

En general se dice que una función toma unos argumentos y devuelve un resultado.
El cuerpo de la función debe ir encerrado entre llaves en el caso de que haya más de una
sentencia.

{cuerpo_de_la_funcion }
Las funciones se crean utilizando la función function() y se almacenan como objetos de
R. Las funciones pertenecen a la clase “function”.
La sintaxis para definir una función es,

nombre <- function (lista_de_parametros) {cuerpo_de_la_funcion}

donde,

Argumento Descripción

nombre Es el nombre de la función que se define.

function Es la palabra clave con la que se declara la función.

lista de parámetros Son los valores, variables u otros objetos de R que se pasan como entrada de la

cuerpo de la función Son las sentencias que constituyen la función.

#Los argumentos de una función


Propiedades

 Los argumentos de las funciones son argumentos con nombre.


 Las funciones en R pueden tener argumentos con valores por defecto, con valor
nulo (NULL) o con valor missing.
 Los argumentos formales de una función son los que se declaran en la definición
de la función.
 La función formals() devuelve la lista de los argumentos de una función.
 La función body() devuelve el cuerpo de la función.
 No es obligatorio incluir todos los argumentos en la llamada a una función.

##Forma de pasar los argumentos a una función


Los argumentos de una función pueden pasarse por:

 nombre
 por posición
 una mezcla de por nombre y posición

Ejemplo 1

mydata <- rnorm(100) # Genera 100 valores provenientes


de una N(0,1)
sd(mydata) # Pasa el parámetro por posición
## [1] 1.072143
sd(x = mydata) # Pasa el parámetro por nombre
## [1] 1.072143
sd(x = mydata, na.rm = FALSE) # Pasa el parámetro por nombre
## [1] 1.072143
sd(na.rm = FALSE, x = mydata) # Pasa el parámetro por nombre
## [1] 1.072143
sd(na.rm = FALSE, mydata) # Pasa el parámetro por nombre y el
segundo por posición
## [1] 1.072143

Cuando un argumento es pasado por nombre, sale del orden de la lista de los argumentos
de la función, mientras que el resto de los argumentos mantienen el orden en el que fueron
declarados en la función.

args(lm)
## function (formula, data, subset, weights, na.action, method = "qr",
## model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok =
TRUE,
## contrasts = NULL, offset, ...)
## NULL

Los siguientes códigos son equivalentes:

lm(data = mydata, y ~ x, model = FALSE, 1:100)


lm(y ~ x, mydata, 1:100, model = FALSE)

En general es recomendable pasar los argumentos por nombre para evitar posibles
confusiones.
En R el proceso de emparejar valores con argumentos sigue estos pasos:

1. Empareja los argumentos que coinciden totalmente con el nombre.


2. Empareja los argumentos que coinciden parcialmente con el nombre.
3. Empareja los argumentos de forma posicional.

##Evaluación perezosa
Los argumentos de una función son evaluados únicamente si es necesario. Esta propiedad
se conoce como “evaluación perezosa” (lazy evaluation),
Ejemplo 2 En la siguiente función f() hay dos arguemntos el a y el b. Cuando se
ejecuta f(2) el argumento a=2 y el b permanece missing. Como b no interviene en el
cálculo del valor de la función no se produce error, es decir R nunca se pregunta por el
valor de b y por lo tanto no se entera que no ha sido especificado.

f <- function(a, b) {
a^2
}
f(2)
## [1] 4

En este segundo ejemplo is falta b, R produce un mensaje de error.


f <- function(a, b) {
print(a)
print(b)
}
f(45)
## [1] 45
## Error in print(b): el argumento "b" está ausente, sin valor por
omisión

Como no se ha pasado el valor de “b”, R produce un mensaje de error al intentar


evaluar print(b).
Se puede ver como la ejecución es secuencial: primero evalúa print(a) y
después print(b).
##El argumento especial “…”
El argumento … indica que hay un número no determinado de argumentos que son
pasados a través de otra función de forma general. Se suele utilizar … cuando se invoca a
otra función y no se quiere copiar toda la lista de argumentos de la función original.

miplot <- function(x, y, type = "l", ...) {


plot(x, y, type = type, ...)
}

Las funciones genéricas utilizan … para pasar argumentos en función del método al que


se aplique.
Una función es genérica cuando se “adapta” al objeto al que se aplica.

mean
## function (x, ...)
## UseMethod("mean")
## <bytecode: 0x000000001591ab28>
## <environment: namespace:base>

El argumento … es necesario cuando no se sabe el número de argumentos que se va a


pasar a una función.

args(paste)
## function (..., sep = " ", collapse = NULL, recycle0 = FALSE)
## NULL
args(cat)
## function (..., file = "", sep = " ", fill = FALSE, labels = NULL,
## append = FALSE)
## NULL
Una vez que se utiliza … el resto de los argumentos deben pasarse por nombre y no se
permite el emparejado parcial.

args(paste)
## function (..., sep = " ", collapse = NULL, recycle0 = FALSE)
## NULL
paste("a", "b", sep = ":")
## [1] "a:b"
paste("a", "b", se = ":")
## [1] "a b :"

Ejemplo 3: Función para calcular la mediana.


En R se dispone de la función median() para calcular la mediana de un conjunto de datos.
Sin embargo, si queremos tener nuestra propia función podemos escribir la siguiente.
Nuestra función ordena el conjunto de datos y toma el elemento que está en el medio.

nuestramediana <- function(x){


n <- length(x)
return(sort(x)[(n+1)/2])
}

La comprobamos con un ejemplo,

nuestramediana <- function(x){


n<-length(x)
return(sort(x)[(n+1)/2])
}

x <- c(1,2,3,4,5)
mean(x)
## [1] 3
nuestramediana(x)
## [1] 3

La nueva función media se llama nuestramedia(). Tiene un único parámetro que es el


conjunto de datos a analizar. El cuerpo de la función esta encerrado entre llaves para
poder declarar varias sentencias. El valor que devuelve está definido en la
función return().
La función return() no es siempre necesaria dentro de una función. Por defecto R
devuelve el último valor calculado.
Ejemplo 4: Solución polinomio de segundo grado
# Polinómio de grado 2
poli_dos <- function(a, b, c,x) { a*x^2 + b*x + c}
y <- poli_dos(2,3,4,10)
print (y)
## [1] 234

Los parámetros se pasan a la función por posición y no por valor. Esto permite utilizar los
mismos nombres dentro y fuera de la función, ya que para R son objetos distintos.
Ejemplo 5: Función logaritmo en base 5

# Cálculo del logaritmo en base 5 de un número

# devuelve el logaritmo en base 5 de un número


log5 <- function(x){
y <- log(x) / log(5)
return(y)
}

Ejemplos de funciones de R son:


Gráficos de alto nivel

y <- c(234, 345, 234, 634, 567, 234, 45,125, 829)


hist(y)
# Para saber más sobre hist() escribir ?hist()
#?hist

Gráficos de bajo nivel


La función plot() es la función gráfica más importante de las de bajo nivel en R.

y <- c(234, 345, 234, 634, 567, 234, 45,125, 829)


plot(y)
grid()
# Para saber más sobre plot() y sobre grid()
#?plot
#?grid()

Otra función gráfica útil es curve().

curve(sin, -pi,pi)
##Por qué utilizar funciones
Las ventajas de dividir un programa en funciones son múltiples entre ellas señalaremos:

 Al agrupar un conjunto de sentencias bajo un nombre hace que el programa sea


más fácil de leer, entender, actualizar y depurar
 Las funciones permiten no repetir código innecesariamente por lo que los
programas son más cortos.
 Una función puede utilizarse en muchos programas. Es decir, permite la
reutilización de un código en diferentes programas.

Ejercicios
1.- Sea la función y=f(x)y=f(x) definida por

f(x)=⎧⎩⎨⎪⎪−x3x2x−−√x≤00<x≤1x>1f(x)={−x3x≤0x20<x≤1xx>1

Se pide que escriba una función en R de forma que para cada xx calcule su


correspondiente yy. Una vez escrita su función utilice el código siguiente para dibujar la
función.
# Introducción
valores.x <- seq(-2,2, by=0.1)

# Para cada x se calcula su y


n <- lenght(valores.x)
valores.y <- rep(0,n)
for (i in 1:n) {
x <- valores.x[i]
# Aquí tiene que ir su función que calcula los distintos valores
de y
valores.y[i] <- función_propia(x)
}
# Salida
plot(valores.x, valores.y, type = "l")

el dibujo debe ser parecido al siguiente gráfico,

A la vista del gráfico anterior, ¿La función ff tiene derivada en 0?¿ y en 1? Se podría


vectorizar el programa utilizando la función ifelse().
2. Sea h(x,n)=1+x+x2+⋯+xn=∑ni=0xih(x,n)=1+x+x2+⋯+xn=∑i=0nxi . Escribe
una función en R para calcular h(x,n)h(x,n) utilizando un bucle for.
3. La función del ejercicio 2, h(x,n)h(x,n), es la suma finita de una serie geométrica.
Se sabe que la formula explícita
para x≠1x≠1 es, h(x,n)=(1−xn+1)/(1−x)h(x,n)=(1−xn+1)/(1−x).
Comprueba tu programa sabiendo que,

x n h(x,n)

0.3 55 1.428571

6.6 8 4243335.538178

4. Escribe un programa que obtenga el mismo resultado que el ejercicio 2 pero


utilizando while en vez de for. Después escribe una función que utiliza
operaciones vectoriales en vez de bucles.

5. Para rotar un vector (x,y)T(x,y)T en sentido anti horario θθ radianes hay que


multiplicar al vector por la derecha por la matriz,

(cos(θ)sin(θ)sin(−θ)cos(θ))(cos(θ)sin(−θ)sin(θ)cos(θ))

Escribe una función en R que lo calcule.

6. Dado un vector xx, calcular su media geométrica utilizando un bucle y operaciones


vectoriales. (La media geométrica de x1,x2,⋯,xnx1,x2,
⋯,xn es (∏ni=1xi)1/n(∏i=1nxi)1/n. Puedes comprobar que la media
armónica (∑ni=11/xi)−1(∑i=1n1/xi)−1 cuando los a xixi son positivos, es siempre
menor o igual que la media geométrica, esta a su vez es siempre menor o igual
que la media aritmética.
7. Escribe una función que calcule el mínimo de un vector sin utilizar ninguna función
de R, en particular las funciones sort() y min().

8. El juego de los dados es como sigue. Primero se lanzan dos dados, sea xx la
suma de los dados. Si x=7x=7 o x=11x=11 ganas, en otro caso sigues tirando
hasta obtener la tirada de la primera vez, en cuyo caso ganas o hasta obtener 7 u
11 en cuyo caso pierdes. Escribe un programa que simule el juego. Puedes utilizar
la siguiente línea que simula el lanzamiento de dos dados, x <-
sum(ceiling(6*runif(2))).
9. Supongamos que (x(t),y(t))(x(t),y(t)) tienen como coordenadas polares (t√,2πt)
(t,2πt). Dibuja un gráfico (x(t),y(t))(x(t),y(t)) para t∈[0,10]t∈[0,10]. Debería tener
el aspecto siguiente,

También podría gustarte