跳转到主要内容
模块 3 · 第 1 课(共 2)课程中的5/10~12 min
模块课程(1/2)

编写函数

在 R 中,函数是一等公民(本身就是对象),允许您将代码构建为模块化、可重用且组织良好的块。

定义函数

要定义函数,请使用 function 关键字,并使用赋值运算符 <- 将创建的对象分配给变量(函数名称):

R
# Simple function definition
greet_user <- function() {
  print("Hello, User!")
}

# Invoking the function
greet_user()

参数和返回值

函数可以接受一个或多个参数。要显式返回值,请使用 return() 函数。如果省略 return() ,R 将自动返回函数体中最后计算的表达式的值。

R
# Function that adds two numbers and returns the result
add_numbers <- function(a, b) {
  sum_result <- a + b
  return(sum_result)
}

total <- add_numbers(5, 7)
print(total) # Prints 12

默认参数

您可以为函数的参数指定默认值。如果调用函数时未提供参数,R 将使用默认值:

R
# The function uses a default discount rate of 10% (0.10)
apply_discount <- function(price, discount = 0.10) {
  discounted_price <- price * (1 - discount)
  return(discounted_price)
}

# Uses the default (10%)
print(apply_discount(100)) # Prints 90

# Specifies a custom discount (20%)
print(apply_discount(100, 0.20)) # Prints 80

使用列表返回多个值

由于 R 中的函数只能通过 return() 直接返回单个对象,因此如果我们需要返回多个值(可能是不同类型或长度),我们可以将它们捆绑在一个列表中(list):

R
get_stats <- function(v) {
  stats <- list(
    mean_val = mean(v),
    max_val = max(v)
  )
  return(stats)
}

results <- get_stats(c(10, 20, 30))
print(results$mean_val) # Prints 20

匿名函数和 sapply

匿名函数(没有内联定义名称的函数)在与 sapply() 等函数配合使用时非常有用,可以对向量或列表的元素应用快速转换。

在现代 R(从版本 4.1.0 开始)中,除了经典的 function(x) 之外,您还可以使用简写语法 \(x) 定义匿名函数:

R
v <- c(1, 2, 3)

# Using sapply with a classic anonymous function
sapply(v, function(x) x^2) # 1 4 9

# Using sapply with shorthand syntax (R >= 4.1.0)
sapply(v, \(x) x^2) # 1 4 9

自己尝试一下

锻炼#r.m3.l1.e1
尝试:0加载中...

定义一个名为 double_value 的函数,该函数接受单个参数 x 并使用 return() 返回其双精度 (x * 2)。

正在加载编辑器...
显示提示

用法:double_value <- function(x) { return(x * 2) }

3 次尝试后可用的解决方案

锻炼#r.m3.l1.e2
尝试:0加载中...

定义一个名为calculate_area 的函数,它接受两个参数:宽度和高度。该函数必须使用 return() 返回其乘积。

正在加载编辑器...
显示提示

使用参数 width 和 height 定义函数,并返回 width * height。

3 次尝试后可用的解决方案

锻炼#r.m3.l1.e3
尝试:0加载中...

定义一个名为calculate_tax 的函数,该函数接受必需的参数金额和可选的参数比率,默认值为 0.22。返回产品金额*费率。

正在加载编辑器...
显示提示

美国:calculate_tax <- function(amount, rates = 0.22) { return(amount * rates) }

3 次尝试后可用的解决方案

锻炼#r.m3.l1.e4
尝试:0加载中...

定义一个名为analyze_vector的函数,它接受向量v。该函数必须返回一个列表,其中包含两个名为sum(向量的总和,用sum(v)计算)和len(向量的长度,用length(v)计算)的元素。

正在加载编辑器...
显示提示

使用语法:analyze_vector <- function(v) { return(list(sum = sum(v), len = length(v))) }

3 次尝试后可用的解决方案

锻炼#r.m3.l1.e5
尝试:0加载中...

给定向量 v,使用 sapply() 函数和匿名函数将每个元素的值增加三倍(将其乘以 3)。将结果保存在变量三倍中。

正在加载编辑器...
显示提示

使用:三倍 <- sapply(v, function(x) x * 3)

3 次尝试后可用的解决方案