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