Menu
Coddy logo textTech

lapply и sapply

Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 32 из 64.

lapply(x, f) вызывает f для каждого элемента x и возвращает результаты в списке, по одному элементу на каждый входной элемент:

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

Вывод:

[1] 3
[1] 9

sapply() делает то же самое и упрощает результат: когда каждый вызов возвращает одно значение, вы получаете обычный вектор вместо списка:

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

Результат:

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

Для вектора символов sapply() задаёт результатам имена, соответствующие входным значениям. Добавьте USE.NAMES = FALSE, чтобы получить обычный вектор:

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

Результат:

   tea coffee 
     3      6 
[1] 3 6

Эти функции заменяют цикл, который создаёт результат по одному элементу за раз. Обе приведённые ниже версии вычисляют, сколько гласных содержит каждое слово:

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))

Вывод:

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

Задание

Легко

Завершите vowel_counts(words). Верните по одной строке на слово, banana: 3, с количеством гласных (a, e, i, o, u) в слове. Используйте sapply(), чтобы подсчитать гласные во всех словах.

Предоставленный код считывает слова в виде строки со словами в нижнем регистре, разделёнными запятыми, и выводит каждую возвращённую строку.

Попробуйте сами

vowel_counts <- function(words) {
  # Напишите ваш код здесь
  character(0)
}

# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
cat(vowel_counts(strsplit(input[1], ",")[[1]]), sep = "\n")
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор R