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] 10R 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] 15Thử 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ố:
doubletrả về đối số nhân với 2squaretrả về đối số nhân với chính nónegatetrả 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")
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
1Chuỗi chuyên sâu
Chuỗi con với substr()Định dạng với sprintf()Tách và nối chuỗiTìm kiếm trong chuỗiThay thế văn bảnÔn tập: Tạo tên người dùng10Luồng điều khiển nâng cao
Hàm switch()ifelse() dạng vector hóarepeat và breakHàm đệ quyÔn tập: phân loại điểmTự luyện tập: Trình biên dịch R online