Lecciones del módulo (1/2)
Escribir Funciones
In R, las funciones son objetos en todos los sentidos (first-class citizens) y permiten estructurar el código en bloques modulares, reutilizables y bien organizados.
Definición de una Función
Para definir una función se utiliza la palabra clave function y se asigna el objeto creado a una variable (el nombre de la función) mediante el operador de asignación <-:
# Definición de una función simple
greet_user <- function() {
print("Hello, User!")
}
# Invocación de la función
greet_user()
Parámetros y Valores de Retorno
Las funciones pueden aceptar uno o más parámetros. Para devolver explícitamente un valor, se utiliza la función return(). Si se omite return(), R devolverá automáticamente el valor de la última expresión evaluada en el cuerpo de la función.
# Función que suma dos números y devuelve el resultado
add_numbers <- function(a, b) {
sum_result <- a + b
return(sum_result)
}
total <- add_numbers(5, 7)
print(total) # Imprime 12
Argumentos Predeterminados (Default)
Es posible especificar valores predeterminados para los parámetros de una función. Si al invocarla no se proporciona el argumento, R utilizará el valor predeterminado (de default):
# La función usa un porcentaje de descuento predeterminado del 10% (0.10)
apply_discount <- function(price, discount = 0.10) {
discounted_price <- price * (1 - discount)
return(discounted_price)
}
# Utiliza el valor predeterminado (10%)
print(apply_discount(100)) # Imprime 90
# Especifica un descuento personalizado (20%)
print(apply_discount(100, 0.20)) # Imprime 80
Devolver varios valores con Listas
Dado que una función en R puede devolver directamente un solo objeto mediante return(), si tenemos la necesidad de devolver múltiples valores (quizás de diferente tipo o longitud), podemos agruparlos dentro de una lista (list):
get_stats <- function(v) {
stats <- list(
mean_val = mean(v),
max_val = max(v)
)
return(stats)
}
results <- get_stats(c(10, 20, 30))
print(results$mean_val) # Imprime 20
Funciones Anónimas y sapply
Las funciones anónimas (es decir, funciones sin nombre definidas sobre la marcha) son extremadamente útiles cuando se combinan con funciones como sapply() para aplicar transformaciones rápidas sobre los elementos de un vector o una lista.
En R moderno (a partir de la versión 4.1.0) es posible definir funciones anónimas usando la sintaxis abreviada \(x) además de la clásica function(x):
v <- c(1, 2, 3)
# Uso de sapply con función anónima clásica
sapply(v, function(x) x^2) # 1 4 9
# Uso de sapply con sintaxis abreviada (R >= 4.1.0)
sapply(v, \(x) x^2) # 1 4 9
Pruébalo tú
Define una función llamada double_value que acepte un único argumento x y devuelva su doble (x * 2) mediante return().
Mostrar pista
Usa la sintaxis: double_value <- function(x) { return(x * 2) }
Solución disponible después de 3 intentos
Define una función llamada calculate_area que acepte dos argumentos: width y height. La función debe devolver su producto mediante return().
Mostrar pista
Define la función con parámetros width y height, y devuelve width * height.
Solución disponible después de 3 intentos
Define una función llamada calculate_tax que acepte un argumento obligatorio amount y un argumento opcional rate con valor predeterminado de 0.22. Devuelve el producto amount * rate.
Mostrar pista
Usa: calculate_tax <- function(amount, rate = 0.22) { return(amount * rate) }
Solución disponible después de 3 intentos
Define una función llamada analyze_vector que acepte un vector v. La función debe devolver una lista que contenga dos elementos llamados sum (la suma del vector, calculada con sum(v)) y len (la longitud del vector, calculada con length(v)).
Mostrar pista
Usa la sintaxis: analyze_vector <- function(v) { return(list(sum = sum(v), len = length(v))) }
Solución disponible después de 3 intentos
Dado el vector v, usa la función sapply() con una función anónima para triplicar el valor de cada elemento (multiplicándolo por 3). Guarda el resultado en la variable tripled.
Mostrar pista
Usa: tripled <- sapply(v, function(x) x * 3)
Solución disponible después de 3 intentos