curso
Tutorial sobre el uso de funciones en R
Si estás pensando en iniciar una carrera en la ciencia de datos, cuanto antes empieces a programar, mejor. Independientemente del lenguaje de programación que hayas elegido para iniciar tu viaje de aprendizaje, en algún momento tendrás una cita con las funciones.
Las funciones son un concepto central en casi todos los lenguajes de programación modernos, incluidos los lenguajes de programación populares en la ciencia de datos, como Python, Juliay, obviamente, R.
En este tutorial, exploraremos qué son las funciones de R y cómo puedes utilizarlas. Al cubrir el propósito, la sintaxis y la tipología de funciones disponibles en R, obtendrá todo lo que necesita para dominar este concepto crítico en programación. Y lo que es más, se le introducirá en el arte de la creación de funciones.
¿Qué es una función en R?
En programación, las funciones son instrucciones organizadas conjuntamente para llevar a cabo una tarea específica. La razón de ser de las funciones es crear programas autónomos que sólo puedan invocarse cuando sea necesario.
Con las funciones, los programadores ya no tienen que escribir un programa desde cero, lo que evita repeticiones y mejora la solidez y legibilidad del código. Por eso, como regla general, es una buena práctica crear una función siempre que preveas ejecutar un determinado conjunto de instrucciones más de dos veces en tu código.
Las funciones pueden utilizarse para infinidad de fines y adoptar diversas formas. En general, la gran mayoría de las funciones toman datos de entrada, los procesan y devuelven un resultado. Los datos sobre los que opera la función se especifican mediante los llamados argumentos, que también pueden utilizarse para controlar o alterar la forma en que la función lleva a cabo las tareas.
Dependiendo del origen de la función, podemos distinguir tres tipos principales de funciones en R:
- Funciones integradas
- Funciones disponibles en los paquetes R
- Funciones definidas por el usuario (UDF)
En las siguientes secciones, explicaremos las particularidades de los distintos tipos de funciones disponibles en R.
Funciones incorporadas en R
R es un potente lenguaje de programación que viene con un amplio catálogo de funciones incorporadas que se pueden llamar en cualquier momento. Como lenguaje orientado a las matemáticas, R viene con un buen número de funciones para realizar operaciones numéricas. A continuación encontrará una lista de algunos de los más útiles:
- print(). Muestra un objeto R en la consola R
- min(), max(). Calcula el mínimo y el máximo de un vector numérico
- sum(). Calcula la suma de un vector numérico
- mean(). Calcula la media de un vector numérico
- range(). Calcula los valores mínimo y máximo de un vector numérico
- str(). Muestra la estructura de un objeto R
- ncol(). Devuelve el número de columnas de una matriz o un marco de datos
- length(). Devuelve el número de elementos de un objeto R, como un vector, una lista y una matriz.
En el código siguiente, puedes ver lo sencillo que es utilizar estas funciones para calcular ciertas estadísticas a partir de un vector:
>>> v <- c(1, 3, 0.2, 1.5, 1.7)
>>> print(v)
[1] 1.0 3.0 0.2 1.5 1.7
>>> sum(v)
[1] 7.4
>>> mean(v)
[1] 1.48
>>> length(v)
[1] 5
Puede aprender funciones de R y mucho más en nuestro completo curso de R, que le ayudará a codificar como un programador.
Funciones en paquetes R
Sin embargo, las numerosas y diversas funciones incorporadas no bastan para hacer todas las cosas interesantes que se pueden hacer con R, desde trazar atractivas visualizaciones de datos hasta entrenar potentes modelos de aprendizaje automático.
La gran mayoría de las funciones para realizar estas tareas están disponibles en paquetes o bibliotecas externas. Los paquetes son colecciones de funciones de R, datos y código compilado en un formato bien definido, creados para añadir una funcionalidad específica. La mayoría de estos paquetes pueden utilizarse de forma gratuita y se encuentran en repositorios de paquetes populares, como CRAN, que actualmente cuenta con casi 20.000 paquetes aportados.
Para utilizar las funciones disponibles en un paquete, primero tendrá que instalarlo. Por ejemplo, si desea instalar stringr, un popular paquete para trabajar con expresiones regulares, puede utilizar la siguiente sentencia:
install.packages('stringr')
Una vez que lo haya instalado, para cargarlo en su entorno R, utilice la sentencia library
library(stringr)
Ahora estás listo para utilizar todas las funciones disponibles en los paquetes stringr. Por ejemplo, probemos la función str_detect()
, que devuelve un vector lógico con TRUE
para cada elemento de la cadena que coincide con el patrón y FALSE
en caso contrario.
str_detect('DataCamp', "Data")
[1] TRUE
Si te interesa saber más sobre los paquetes de R y cómo utilizarlos, consulta este tutorial de DataCamp sobre paquetes de R.
Funciones definidas por el usuario
La mejor manera de entender cómo funcionan las funciones en R es creando sus propias funciones. Las llamadas funciones definidas por el usuario (UDF) son diseñadas por los programadores para realizar una tarea específica.
Las funciones de R adoptan normalmente la siguiente sintaxis:
function_name <- function(argument_1, argument_2) {
function body
return (output)
}
Podemos distinguir los cuatro elementos principales:
- Nombre de la función. Para crear una UDF, primero hay que asignarle un nombre y guardarla como un objeto nuevo. Sólo tienes que llamar al nombre cada vez que quieras utilizar la función.
- Argumentos. Los argumentos de la función (también conocidos como parámetros) se proporcionan dentro de los paréntesis. Los argumentos son clave para que la función sepa qué datos tomar como entrada y/o cómo modificar el comportamiento de la función.
- Cuerpo funcional. Entre llaves viene el cuerpo de la función, es decir, las instrucciones para resolver una tarea concreta a partir de la información proporcionada por los argumentos.
- Declaración de devolución. La sentencia return es necesaria si desea que la función guarde como variables el resultado o resultados tras las operaciones en el cuerpo de la función.
Por ejemplo, si desea crear una función que calcule la media de dos números:
mean_two_numbers <- function(num_1, num_2) {
mean <- (num_1 + num_2) / 2
return (mean)
}
Ahora, si quieres calcular la media de 10 y 20, sólo tienes que llamar a la función como se indica a continuación:
>>> mean_two_numbers(10,20)
[1] 15
Tipos de argumentos en las funciones de R
Los argumentos son elementos vitales en toda función. Aunque en teoría es posible escribir una función sin parámetros (véase el ejemplo siguiente), la mayoría de las funciones tienen argumentos. Eso tiene sentido, ya que los argumentos indican a la función qué datos debe tomar como entrada. Del mismo modo, si queremos dotar a una función de varias formas de realizar una tarea, los argumentos servirán.
hello <- function() {
print('hello, my friend')
}
>>> hello()
[1] "hello, my friend"
No hay límite en el número de argumentos en las funciones de R; puede añadirlos entre paréntesis separados por comas. Por lo general, las funciones con más argumentos suelen ser más complejas.
Una vez que haya creado una función con parámetros, cada vez que quiera utilizarla, tendrá que proporcionar los valores de los distintos parámetros; de lo contrario, R arrojará un error. Por ejemplo, si no proporcionas los valores de los dos números para calcular su media, nuestra función no funcionará.
Sin embargo, podría evitar este error utilizando argumentos por defecto en el momento de definir una función. Los argumentos por defecto proporcionan un valor por defecto que se utilizará si se llama a la función sin proporcionar ese argumento. Volvamos de nuevo a nuestra función para calcular la media de dos números. Esta vez, lo definiremos para añadir un argumento por defecto para el segundo número.
mean_two_numbers <- function(num_1, num_2 = 30) {
mean <- (num_1 + num_2) / 2
return (mean)
}
Si ahora llamamos a la función sin proporcionar el valor del parámetro num_2
, R tomará automáticamente el valor por defecto (es decir, 30):
>>> mean_two_numbers(num_1 = 10)
[1] 20
Comprender los valores de retorno de las funciones de R
Las funciones normalmente toman algunos datos como entrada y dan un resultado como salida. En algunos lenguajes de programación, para guardar el resultado de una función como variable, es necesario incluir explícitamente la sentencia return al final del cuerpo de la función. De lo contrario, la función sólo mostrará un valor que sólo exista dentro del ámbito de la variable.
Este no es el caso en R, que siempre devolverá un valor que se puede almacenar en una variable. Sin embargo, en aras de la legibilidad, siempre es una buena práctica incluir la sentencia return al definir una función.
mean_two_numbers <- function(num_1, num_2) {
# Function with return
mean <- (num_1 + num_2) / 2
return (mean)
}
mean_two_numbers_2 <- function(num_1, num_2) {
# Function without return
mean <- (num_1 + num_2) / 2
mean
}
> mean_two_numbers(10,50)
[1] 30
> mean_two_numbers_2(10,50)
[1] 30
Por último, si desea que su función devuelva varios valores, tendrá que almacenar los distintos resultados en una lista e incluirla en la sentencia return:
mean_sum <- function(num_1, num_2) {
mean <- (num_1 + num_2) / 2
sum <- num_1 + num_2
return (list(mean, sum))
}
>>> mean_sum (10, 20)
[[1]]
[1] 15
[[2]]
[1] 30
Llamada a funciones en R
En las secciones anteriores ya hemos visto varios ejemplos sobre cómo llamar a una función. Sin embargo, es importante aclarar cómo funciona R bajo el capó cuando pasamos los argumentos.
R admite dos formas de pasar argumentos: por posición y por nombre. Si seguimos la primera estrategia, tendremos que escribir los valores siguiendo el mismo orden de argumentos que el definido en la función.
Si pasamos los argumentos por su nombre, tendremos que especificar explícitamente los nombres de los argumentos y sus valores asociados. Como hemos emparejado argumentos y valores, el orden no importa.
Por último, también es posible mezclar ambas estrategias. En este caso, los argumentos con nombre se extraen de la lista de argumentos y se comparan en primer lugar, mientras que el resto de argumentos se comparan por posición.
hello <- function(name, surname) {
print(paste('Hello', name, surname))
}
# Calling arguments by position
> hello('Greta','Thunberg')
[1] "Hello, Greta Thunberg"
# Calling arguments by name
> hello(surname='Thunberg', name='Greta')
[1] "Hello, Greta Thunberg"
# Calling arguments by position and by name
> hello(surname='Thunberg', 'Greta')
[1] "Hello, Greta Thunberg"
Documentación de funciones en R
Una buena práctica a la hora de crear funciones es proporcionar documentación sobre cómo utilizarlas, especialmente cuando las funciones son complejas. Una manera informal de hacerlo es añadiendo comentarios en el cuerpo de las funciones. Puede añadir la documentación llamando a la función sin parámetros:
hello <- function(name, surname) {
# Say hello to a person with name and surname
print(paste('Hello', name, surname))
}
>>> hello
function(name, surname) {
# Say hello to a person with name and surname
print(paste('Hello,', name, surname))
Sin embargo, si su función forma parte de un paquete mayor y desea documentarla, deberá escribir la documentación formal en un documento .Rd aparte. El resultado de esta documentación se ve cuando se consulta el archivo de ayuda de una función determinada, por ejemplo ?mean.
Conclusión
Has llegado al final del tutorial. ¡Felicidades! Como en muchos otros lenguajes, las funciones son elementos vitales en R. Ya sean incorporadas, desarrolladas como parte de paquetes externos, o incluso creadas por usted, dominar las funciones es un hito importante en su viaje por la programación. Si quiere seguir desarrollando sus conocimientos sobre la función en R, consulte los siguientes recursos.
R cursos
curso
Introduction to R
curso
Intermediate R
tutorial
Tutorial de RStudio
tutorial
A Loops in R Tutorial - Uso y Alternativas
tutorial
Tutorial de regresión lineal en R
Eladio Montero Porras
15 min
tutorial
Tutorial sobre cómo importar datos a R
tutorial