R语言返回值 #

一、返回值概述 #

函数的返回值是函数执行完毕后返回给调用者的结果。

二、return语句 #

2.1 显式返回 #

r
add <- function(a, b) {
  return(a + b)
}

add(1, 2)

2.2 提前返回 #

r
divide <- function(a, b) {
  if (b == 0) {
    return(NA)
  }
  a / b
}

divide(10, 2)
divide(10, 0)

2.3 多个return #

r
classify <- function(x) {
  if (x < 0) return("负数")
  if (x == 0) return("零")
  return("正数")
}

classify(-5)
classify(0)
classify(5)

三、隐式返回 #

3.1 最后一个表达式 #

r
add <- function(a, b) {
  a + b
}

add(1, 2)

3.2 复杂表达式 #

r
calculate <- function(a, b, op) {
  if (op == "+") a + b
  else if (op == "-") a - b
  else if (op == "*") a * b
  else NA
}

calculate(10, 5, "+")

3.3 推荐使用 #

r
good_func <- function(x) {
  if (x < 0) {
    return(NA)
  }
  sqrt(x)
}

good_func(4)
good_func(-1)

四、多返回值 #

4.1 使用列表 #

r
stats <- function(x) {
  list(
    mean = mean(x),
    sd = sd(x),
    n = length(x)
  )
}

result <- stats(c(1, 2, 3, 4, 5))
result$mean
result$sd

4.2 使用向量 #

r
minmax <- function(x) {
  c(min = min(x), max = max(x))
}

minmax(c(1, 2, 3, 4, 5))

4.3 使用数据框 #

r
describe <- function(x) {
  data.frame(
    statistic = c("mean", "sd", "min", "max"),
    value = c(mean(x), sd(x), min(x), max(x))
  )
}

describe(c(1, 2, 3, 4, 5))

4.4 使用环境 #

r
make_result <- function() {
  env <- new.env()
  env$x <- 10
  env$y <- 20
  env
}

result <- make_result()
result$x
result$y

五、NULL返回 #

5.1 条件返回NULL #

r
find_item <- function(x, target) {
  idx <- which(x == target)
  if (length(idx) == 0) {
    return(NULL)
  }
  idx
}

find_item(c(1, 2, 3), 2)
find_item(c(1, 2, 3), 5)

5.2 检查NULL #

r
result <- find_item(c(1, 2, 3), 5)

if (is.null(result)) {
  print("未找到")
} else {
  print(paste("找到,位置:", result))
}

六、错误返回 #

6.1 使用stop #

r
divide <- function(a, b) {
  if (b == 0) {
    stop("除数不能为零")
  }
  a / b
}

tryCatch(
  divide(10, 0),
  error = function(e) print(e$message)
)

6.2 使用warning #

r
sqrt_positive <- function(x) {
  if (x < 0) {
    warning("输入为负数,返回NA")
    return(NA)
  }
  sqrt(x)
}

sqrt_positive(-1)

6.3 使用tryCatch #

r
safe_divide <- function(a, b) {
  tryCatch({
    a / b
  }, error = function(e) {
    NA
  })
}

safe_divide(10, 2)
safe_divide(10, 0)

七、不可见返回 #

7.1 invisible函数 #

r
my_print <- function(x) {
  print(x)
  invisible(x)
}

result <- my_print(1:5)
print(result)

7.2 链式调用 #

r
add <- function(x, y) {
  invisible(x + y)
}

1:5 |> add(10) |> add(20)

八、实践示例 #

8.1 数据分析结果 #

r
analyze <- function(data) {
  list(
    summary = summary(data),
    n = length(data),
    mean = mean(data),
    sd = sd(data),
    is_normal = shapiro.test(data)$p.value > 0.05
  )
}

result <- analyze(rnorm(100))
print(result$mean)
print(result$is_normal)

8.2 模型拟合结果 #

r
fit_model <- function(x, y) {
  model <- lm(y ~ x)
  
  list(
    coefficients = coef(model),
    r_squared = summary(model)$r.squared,
    predictions = fitted(model),
    residuals = residuals(model)
  )
}

x <- 1:10
y <- 2 * x + rnorm(10)

result <- fit_model(x, y)
print(result$coefficients)
print(result$r_squared)

8.3 文件处理结果 #

r
read_data <- function(file) {
  if (!file.exists(file)) {
    return(list(success = FALSE, error = "文件不存在"))
  }
  
  tryCatch({
    data <- read.csv(file)
    list(
      success = TRUE,
      data = data,
      n_rows = nrow(data),
      n_cols = ncol(data)
    )
  }, error = function(e) {
    list(success = FALSE, error = e$message)
  })
}

九、总结 #

本章学习了:

  • return语句的使用
  • 隐式返回机制
  • 多返回值处理
  • NULL返回
  • 错误和警告处理
  • invisible不可见返回

合理设计返回值可以使函数更加易用和健壮!

最后更新:2026-03-27