Funciones
Creación de funciones documentadas¶
Las funciones constituyen un tipo de objeto que actúa como una herramienta para agrupar varias operaciones. El modelo de creación de una función es el siguiente:
1 2 3 |
|
Los argumentos son las variables que participan en las operaciones y permiten que les sean asignados los elementos que el usuario desee que sean sometidos a las operaciones de la función, los cuales pueden ser incluso otras funciones. La asignación de la función a una variable se conoce como definición de la función. El nombre asignado, que no puede ser idéntico a funciones existentes o palabras reservadas ni contener espacios, se empleará como llamada de ella, tal que así:
1 |
|
No obstante, si la función se ha guardado en un script, primeramente se debe cargar la función con source()
. Cuando se corre una función, ésta devuelve como resultado el último valor calculado. Si bien, se recomienda indicar en las operaciones aquello que se pretende obtener de ella mediante la instrucción return()
, que interrumpe su ejecución y devuelve el argumento que contenga dicha instrucción.
En las operaciones de la función se pueden incluir condiciones para que se devuelva un error si el elemento que el usuario quiera someter a dicha función no cumple determinados requisitos. Esto se consigue con la función stopifnot()
o estructuras de control como construcciones if-else y la función stop()
. Además de este tipo de errores, la ejecución de la función puede derivar en otros muchos errores, por lo que es importante incluir comentarios (#) o crear documentación para la función diseñada. Esto es recomendable hacerlo mediante el sistema de documentación Roxygen y se debe guardar en formato .Rd para que la descripción aparezca cuando se consulte la ayuda de la función.
Ejemplo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
En el apartado Variables, objetos atómicos y operadores se realizaron los scripts Kelvin_a_Celsius.R y pesetas_a_euros.R. Modifique los scripts para que el programa no se ejecute si los grados son inferiores al cero absoluto y las pesetas son negativas. ¿Qué has incluido en los scripts?Respuesta
1
2
3
4
5
if(kelvin < 0) {
stop("Inferior a 0 absoluto.")
}
stopifnot(pesetas > 0)
Cree un script llamado moda.R que defina una función para conocer la moda de un vector numérico.Respuesta
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#' @title Moda
#' @description
#' \code{moda} calcula la moda del vector numérico indicado.
#' @param V Vector numérico
#' @return Vector numérico de longitud uno con el valor de la moda.
#'
#' @author Ismael Sánchez Pareja
#'
#' @examples
#' moda(c(3,4,2,3,5,4,5,6,2,4,3))
#' @export
moda <- function(V) {
uV <- sort(unique(V)) # Elimina duplicaciones y ordena
Ht <- tabulate(match(V, uV)) # Histograma dado
pos_max <- which.max(Ht) # Posicion del max
moda <- uV[pos_max] # Toma el valor más repetido
return (moda)
}
Ejercicios complementarios¶
Cree un script llamado "ecuacion_parabola.R" que defina una función que aplique la ecuación de la parabola a un valor x.Respuesta
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#' @title Cálculo de la ecuación de una parábola.
#' @description
#' \code{ecuacion_parabola} calcula el valor y de la ecuación de una parábola.
#' @param x: valor x; a: término cuadrático; b: término lineal; c: término independiente
#' @return Vector numérico de longitud uno con el valor de y.
#'
#' @author Ismael Sánchez Pareja
#'
#' @examples
#' ecuacion_parabola(c(2,1,3,2))
#' @export
ecuacion_parabola <- function(x,a,b,c) {
y <- a* x^2 +b*x +c
return(y)
}
Cree un script llamado segundo_grado.R que defina una función para resolver una ecuación de segundo grado tipo ax^2 + bx + c.Respuesta
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#' @title Cálculo de la ecuación de segundo grado.
#' @description
#' \code{segundo_grado} calcula la incógnita de una ecuación de segundo grado.
#' @param a: término cuadrático; b: término lineal; c: término independiente
#' @return Dos vectores numéricos de longitud uno con el valor de la incógnita.
#'
#' @author Ismael Sánchez Pareja
#'
#' @examples
#' ecuacion_parabola(c(1,3,2))
#' @export
segundo_grado <- function(a, b, c) {
if(!is.numeric(a) | !is.numeric(b) | !is.numeric(c)) {
stop("Algún argumento no es un vector numeric.")
}
num_para_sqrt <- b^2 - 4 * a * c
stopifnot(num_para_sqrt >= 0)
x1 <- (-b + sqrt(num_para_sqrt)) / (2 * a)
x2 <- (-b - sqrt(num_para_sqrt)) / (2 * a)
return(c(x1, x2))
}
Enlaces de interés
-
R para Análisis Científicos Reproducibles. Software Carpentry.
-
Material del curso Informática aplicada a la Bioquímica. Manuel Jesús Marín Jiménez, Universidad de Córdoba.
-
R, RStudio y R-Commander: guía introductoria. Manuel Jesús Marín Jiménez & José Diz Pérez.