Chuyển đến nội dung chính
Mô-đun 3 · Bài học 1 trong tổng số 25/10 trong khóa học~12 min
Bài học theo mô-đun (1/2)

Chức năng viết

Trong R, các hàm là công dân hạng nhất (các đối tượng có quyền riêng của chúng) và cho phép bạn cấu trúc mã của mình thành các khối mô-đun, có thể tái sử dụng và được tổ chức tốt.

Xác định một hàm

Để xác định hàm, hãy sử dụng từ khóa function và gán đối tượng đã tạo cho một biến (tên hàm) bằng toán tử gán <-:

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

# Invoking the function
greet_user()

Tham số và giá trị trả về

Hàm có thể chấp nhận một hoặc nhiều tham số. Để trả về một giá trị một cách rõ ràng, hãy sử dụng hàm return(). Nếu return() bị bỏ qua, R sẽ tự động trả về giá trị của biểu thức được đánh giá cuối cùng trong thân hàm.

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

Đối số mặc định

Bạn có thể chỉ định các giá trị mặc định cho các tham số của hàm. Nếu đối số không được cung cấp khi hàm được gọi, R sẽ sử dụng giá trị mặc định:

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

Trả về nhiều giá trị với danh sách

Vì một hàm trong R chỉ có thể trả về một đối tượng trực tiếp thông qua return(), nên nếu chúng ta cần trả về nhiều giá trị (có thể có loại hoặc độ dài khác nhau), chúng ta có thể gộp chúng vào trong một danh sách (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

Hàm ẩn danh và sapply

Các hàm ẩn danh (các hàm không có tên được xác định nội tuyến) cực kỳ hữu ích khi kết hợp với các hàm như sapply() để áp dụng các phép biến đổi nhanh trên các phần tử của vectơ hoặc danh sách.

Trong R hiện đại (từ phiên bản 4.1.0 trở đi), bạn có thể xác định các hàm ẩn danh bằng cú pháp tốc ký \(x) ngoài function(x) cổ điển:

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

Hãy tự mình thử

tập thể dục#r.m3.l1.e1
Nỗ lực: 0Đang tải…

Xác định hàm có tên double_value chấp nhận một đối số x và trả về giá trị gấp đôi (x * 2) bằng cách sử dụng return().

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Ví dụ sử dụng: double_value <- function(x) { return(x * 2) }

Giải pháp khả dụng sau 3 lần thử

tập thể dục#r.m3.l1.e2
Nỗ lực: 0Đang tải…

Xác định hàm có tên là Calculate_area chấp nhận hai đối số: chiều rộng và chiều cao. Hàm phải trả về sản phẩm của mình bằng return().

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Xác định hàm với các tham số chiều rộng và chiều cao và trả về chiều rộng * chiều cao.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#r.m3.l1.e3
Nỗ lực: 0Đang tải…

Xác định hàm có tên là Calculate_tax chấp nhận số lượng đối số bắt buộc và tỷ lệ đối số tùy chọn có giá trị mặc định là 0,22. Trả về số lượng sản phẩm*tỷ lệ.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Hoa Kỳ: Calculate_tax <- function(amount, rate = 0.22) { return(amount * rate) }

Giải pháp khả dụng sau 3 lần thử

tập thể dục#r.m3.l1.e4
Nỗ lực: 0Đang tải…

Xác định hàm có tên analyze_vector chấp nhận vectơ v. Hàm phải trả về một danh sách chứa hai phần tử có tên sum (tổng của vectơ, được tính bằng sum(v)) và len (độ dài của vectơ, được tính bằng length(v)).

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng cú pháp: analyze_vector <- function(v) { return(list(sum = sum(v), len = length(v))) }

Giải pháp khả dụng sau 3 lần thử

tập thể dục#r.m3.l1.e5
Nỗ lực: 0Đang tải…

Cho vectơ v, hãy sử dụng hàm sapply() với hàm ẩn danh để nhân ba giá trị của mỗi phần tử (nhân nó với 3). Lưu kết quả vào biến gấp ba.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng: gấp ba lần <- sapply(v, function(x) x * 3)

Giải pháp khả dụng sau 3 lần thử