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.