return() en R: devolver valores (y varios a la vez)
return() indica qué devuelve una función. Lo curioso de R es que casi nunca hace falta escribirlo: una función devuelve por defecto el resultado de su última línea.
Ejemplo simple
Estas dos funciones son idénticas:
doble <- function(x) {
x * 2
}
doble <- function(x) {
return(x * 2)
}
Si vienes de Python o de JavaScript, escribir return() te saldrá solo. No está mal, pero en R lo habitual es omitirlo cuando el valor está en la última línea.
Cuándo sí lo necesitas: salir antes
Aquí es donde return() gana. Para interrumpir la función y salir sin ejecutar el resto:
dividir <- function(a, b) {
if (b == 0) {
return(NA)
}
a / b
}
dividir(10, 2)
dividir(10, 0)
Sin ese return(), R seguiría hasta la división y te devolvería Inf. Con él, sales limpiamente en cuanto detectas el caso raro.
Es un patrón que conviene coger: comprobaciones al principio, salida temprana, y el trabajo de verdad después. El código queda mucho más plano que anidando if y else.
Ejemplo algo más completo: devolver varios valores
R solo puede devolver un objeto. Pero ese objeto puede contener muchas cosas.
Si todos los resultados son del mismo tipo, un vector con nombres basta:
estadisticas <- function(x) {
c(media = mean(x), mediana = median(x), n = length(x))
}
resultado <- estadisticas(c(4, 7, 9, 12))
resultado["media"]
Si son de tipos distintos —un número, un texto, una tabla—, entonces una lista:
analizar <- function(x) {
list(
resumen = summary(x),
valores = x,
aviso = if (any(is.na(x))) "Hay valores ausentes" else "Datos completos"
)
}
salida <- analizar(c(4, 7, NA, 12))
salida$aviso
salida$resumen
Se accede a cada parte con el dólar, igual que en un data frame.
La lista es la respuesta de R a "devolver varias cosas". Es lo que hacen por dentro funciones como lm(): te devuelven un objeto con coeficientes, residuos, datos y más, todo en la misma bolsa.