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