Menu
CoddyTech

lapply và sapply

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 32 trên 64.

lapply(x, f) gọi f với từng phần tử của x và trả về kết quả dưới dạng danh sách, mỗi đầu vào tương ứng với một phần tử:

squares <- lapply(1:3, function(i) i^2)
print(length(squares))
print(squares[[3]])

Đầu ra:

[1] 3
[1] 9

sapply() thực hiện tương tự và đơn giản hóa kết quả: khi mỗi lần gọi trả về một giá trị, bạn nhận được một mảng thông thường thay vì một danh sách:

print(sapply(1:3, function(i) i^2))
print(sapply(c(4, 9, 16), sqrt))

Đầu ra:

[1] 1 4 9
[1] 2 3 4

Với một vector ký tự, sapply() đặt tên cho các kết quả theo các đầu vào. Thêm USE.NAMES = FALSE để nhận một vector thuần:

words <- c("tea", "coffee")
print(sapply(words, nchar))
print(sapply(words, nchar, USE.NAMES = FALSE))

Đầu ra:

   tea coffee 
     3      6 
[1] 3 6

Các hàm này thay thế vòng lặp tạo kết quả từng phần tử một. Cả hai phiên bản dưới đây đều tính số nguyên âm trong mỗi từ:

words <- c("banana", "sky", "idea")
vowels <- function(w) sum(strsplit(w, "")[[1]] %in% c("a", "e", "i", "o", "u"))
counts <- c()
for (w in words) counts <- c(counts, vowels(w))
print(counts)
print(sapply(words, vowels, USE.NAMES = FALSE))

Đầu ra:

[1] 3 0 3
[1] 3 0 3
challenge icon

Thử thách

Dễ

Hoàn thành vowel_counts(words). Trả về một dòng cho mỗi từ, banana: 3, kèm số nguyên âm (a, e, i, o, u) trong từ đó. Dùng sapply() để đếm nguyên âm trong tất cả các từ.

Code được cung cấp đọc các từ dưới dạng một dòng gồm các từ viết thường, 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ử

vowel_counts <- function(words) {
  # Viết code của bạn tại đây
  character(0)
}

# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(vowel_counts(strsplit(input[1], ",")[[1]]), 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