Reduce
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 35 trên 64.
Reduce(f, x) gộp các phần tử của x thành một giá trị: hàm này gọi f với hai phần tử đầu tiên, sau đó với kết quả đó và phần tử thứ ba, rồi tiếp tục như vậy. Với +, nó cộng tất cả lại:
print(Reduce(function(acc, x) acc + x, c(3, 5, 10)))
print(Reduce(`+`, 1:5))Đầu ra:
[1] 18
[1] 15Các toán tử như + cũng là hàm. Khi viết trong dấu backtick, bạn có thể truyền `+` như bất kỳ hàm nào khác. Reduce() hữu ích nhất khi không có hàm dựng sẵn để kết hợp, chẳng hạn như giữ lại từ dài hơn trong hai từ:
longer <- function(a, b) if (nchar(b) > nchar(a)) b else a
print(Reduce(longer, c("fig", "banana", "kiwi", "cherry")))Đầu ra:
[1] "banana"Đối số thứ ba, init, là giá trị bắt đầu. Nó được dùng làm acc đầu tiên, đồng thời cũng là kết quả khi x rỗng:
print(Reduce(`+`, c(), 0))
print(Reduce(function(acc, w) paste0(acc, toupper(substr(w, 1, 1))), c("portable", "network", "graphics"), ""))Đầu ra:
[1] 0
[1] "PNG"accumulate = TRUE trả về mọi kết quả trung gian thay vì chỉ kết quả cuối cùng, nhờ đó bạn có được tổng lũy kế:
deposits <- c(100, -30, 50, -80)
print(Reduce(`+`, deposits, accumulate = TRUE))Đầu ra:
[1] 100 70 120 40Thử thách
DễHoàn thiện running_balance(start, changes). Bắt đầu từ start, áp dụng từng thay đổi theo thứ tự. Trả về một dòng cho mỗi thay đổi, ghi số dư sau thay đổi đó, after 1: 70, và dòng cuối cùng là lowest: theo sau là số dư thấp nhất đạt được, tính cả start.
Code được cung cấp đọc số dư ban đầu và các thay đổi từ một dòng, trong đó các thay đổi được phân tách bằng dấu phẩy, rồi in ra từng dòng được trả về.
Tự làm thử
running_balance <- function(start, changes) {
# Viết code của bạn ở đây
character(0)
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(running_balance(as.numeric(input[1]), as.numeric(strsplit(input[2], ",")[[1]])), 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