Menu
CoddyTech

Hàm ẩn danh

Thuộc phần Logic và luồng điều khiển trong hành trình R của Coddy. Bài học 27 trên 64.

Trong R, hàm (function) là một giá trị như số hoặc chuỗi. function(x) x * 2 tạo một hàm không cần đặt tên, và giá trị của biểu thức cuối cùng là giá trị trả về của hàm:

double <- function(x) x * 2
print(double(21))
print((function(x) x + 1)(9))

Đầu ra:

[1] 42
[1] 10

R 4.1 bổ sung dạng viết tắt: \(x) có nghĩa giống như function(x). Dùng dấu ngoặc nhọn khi phần thân cần nhiều dòng:

square <- \(x) x^2
label <- function(x) {
  size <- if (x > 10) "big" else "small"
  paste(x, "is", size)
}
print(square(4))
print(label(12))

Đầu ra:

[1] 16
[1] "12 is big"

Vì hàm là các giá trị, danh sách có thể chứa nhiều hàm dưới các tên riêng. ops[["inc"]] là một hàm, nên ops[["inc"]](5) gọi hàm đó:

ops <- list(inc = \(x) x + 1, neg = \(x) -x)
print(ops[["inc"]](5))
print(names(ops))

Đầu ra:

[1] 6
[1] "inc" "neg"

Hàm (function) có thể nhận nhiều đối số và đặt giá trị mặc định cho một số đối số, giống như hàm được đặt tên:

area <- \(w, h = w) w * h
print(area(3))
print(area(3, 5))

Đầu ra:

[1] 9
[1] 15
challenge icon

Thử thách

Dễ

Hoàn thành danh sách ops với ba hàm ẩn danh, mỗi hàm nhận một đối số:

  • double trả về đối số nhân với 2
  • square trả về đối số nhân với chính nó
  • negate trả về đối số với dấu bị đảo ngược

Đoạn code được cung cấp đọc tên một phép toán và một số, gọi hàm tương ứng trong ops rồi in ra kết quả.

Tự làm thử

ops <- list(
  # Viết code của bạn ở đây
  double = function(x) x
)

# Đoạn code đầu vào và đầu ra đã cho: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
f <- ops[[input[1]]]
cat(f(as.numeric(input[2])), sep = "\n")
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch R online