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 <-:
# 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.
# 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:
# 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 80Trả 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):
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 20Hà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:
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 9Hãy tự mình thử
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().
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ử
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().
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ử
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ệ.
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ử
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)).
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ử
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.
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ử