R语言函数参数 #
一、参数概述 #
R语言函数支持多种参数类型,提供了灵活的参数传递方式。
二、位置参数 #
2.1 基本用法 #
r
add <- function(a, b, c) {
a + b + c
}
add(1, 2, 3)
2.2 部分匹配 #
r
greet <- function(name, greeting) {
paste(greeting, name)
}
greet("张三", "Hello")
greet(n = "张三", g = "Hello")
三、命名参数 #
3.1 完全命名 #
r
add <- function(a, b, c) {
a + b + c
}
add(a = 1, b = 2, c = 3)
add(c = 3, a = 1, b = 2)
3.2 混合使用 #
r
add <- function(a, b, c) {
a + b + c
}
add(1, c = 3, b = 2)
四、默认参数 #
4.1 基本默认值 #
r
greet <- function(name, greeting = "Hello") {
paste(greeting, name)
}
greet("张三")
greet("张三", "Hi")
4.2 多个默认值 #
r
create_vector <- function(n = 5, value = 0) {
rep(value, n)
}
create_vector()
create_vector(10)
create_vector(10, 1)
create_vector(value = 1)
4.3 表达式默认值 #
r
current_time <- function(format = "%Y-%m-%d %H:%M:%S") {
format(Sys.time(), format)
}
current_time()
current_time("%Y年%m月%d日")
4.4 NULL默认值 #
r
process <- function(data, transform = NULL) {
if (!is.null(transform)) {
data <- transform(data)
}
data
}
process(c(1, 2, 3))
process(c(1, 2, 3), log)
五、可变参数 (…) #
5.1 基本用法 #
r
sum_all <- function(...) {
args <- list(...)
sum(unlist(args))
}
sum_all(1, 2, 3, 4, 5)
5.2 获取参数 #
r
print_args <- function(...) {
args <- list(...)
for (name in names(args)) {
cat(name, "=", args[[name]], "\n")
}
}
print_args(a = 1, b = 2, c = 3)
5.3 传递给其他函数 #
r
my_mean <- function(x, ...) {
mean(x, ...)
}
my_mean(c(1, 2, NA, 4), na.rm = TRUE)
5.4 混合参数 #
r
my_func <- function(a, b = 10, ...) {
extra <- list(...)
list(a = a, b = b, extra = extra)
}
my_func(1, 2, c = 3, d = 4)
六、missing函数 #
6.1 检查参数是否提供 #
r
greet <- function(name) {
if (missing(name)) {
print("Hello, stranger!")
} else {
print(paste("Hello,", name))
}
}
greet()
greet("张三")
6.2 条件默认值 #
r
calculate <- function(x, multiplier) {
if (missing(multiplier)) {
multiplier <- 2
}
x * multiplier
}
calculate(10)
calculate(10, 5)
七、参数验证 #
7.1 类型检查 #
r
add_numbers <- function(a, b) {
if (!is.numeric(a) || !is.numeric(b)) {
stop("参数必须是数值类型")
}
a + b
}
add_numbers(1, 2)
7.2 范围检查 #
r
set_age <- function(age) {
if (age < 0 || age > 150) {
stop("年龄必须在0-150之间")
}
age
}
set_age(25)
7.3 值检查 #
r
set_gender <- function(gender) {
valid <- c("男", "女", "M", "F")
if (!gender %in% valid) {
stop("性别必须是: 男, 女, M, F")
}
gender
}
set_gender("男")
7.4 综合验证 #
r
validate_input <- function(x, type = "numeric", min_val = NULL, max_val = NULL) {
if (type == "numeric" && !is.numeric(x)) {
stop("输入必须是数值类型")
}
if (!is.null(min_val) && any(x < min_val)) {
stop(paste("值不能小于", min_val))
}
if (!is.null(max_val) && any(x > max_val)) {
stop(paste("值不能大于", max_val))
}
TRUE
}
validate_input(c(1, 2, 3), min_val = 0, max_val = 10)
八、惰性求值 #
8.1 参数惰性求值 #
r
f <- function(a, b) {
print("开始执行")
print(a)
print(b)
}
f(1, stop("错误"))
8.2 默认参数惰性求值 #
r
f <- function(a, b = a * 2) {
print(a)
print(b)
}
f(5)
九、实践示例 #
9.1 灵活的绘图函数 #
r
my_plot <- function(x, y = NULL, type = "p", main = "",
xlab = "x", ylab = "y", ...) {
if (is.null(y)) {
y <- x
x <- 1:length(x)
}
plot(x, y, type = type, main = main, xlab = xlab, ylab = ylab, ...)
}
my_plot(1:10)
my_plot(1:10, type = "l", col = "red")
9.2 数据处理函数 #
r
process_data <- function(data,
remove_na = TRUE,
normalize = FALSE,
log_transform = FALSE) {
if (remove_na) {
data <- na.omit(data)
}
if (log_transform) {
data <- log(data)
}
if (normalize) {
data <- (data - min(data)) / (max(data) - min(data))
}
data
}
x <- c(1, 2, NA, 4, 5)
process_data(x)
process_data(x, normalize = TRUE)
9.3 通用统计函数 #
r
stat_summary <- function(x,
stats = c("mean", "sd", "min", "max"),
na.rm = TRUE,
digits = 2) {
result <- list()
for (stat in stats) {
result[[stat]] <- switch(stat,
"mean" = round(mean(x, na.rm = na.rm), digits),
"sd" = round(sd(x, na.rm = na.rm), digits),
"min" = min(x, na.rm = na.rm),
"max" = max(x, na.rm = na.rm),
"median" = median(x, na.rm = na.rm),
NA
)
}
as.data.frame(result)
}
stat_summary(c(1, 2, 3, 4, 5))
stat_summary(c(1, 2, 3, 4, 5), stats = c("mean", "median"))
十、总结 #
本章学习了:
- 位置参数和命名参数
- 默认参数的使用
- 可变参数 …
- missing函数检查参数
- 参数验证技巧
- 惰性求值机制
灵活使用参数可以使函数更加强大和易用!
最后更新:2026-03-27