lapplyとsapply
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 32/64。
lapply(x, f) は x の各要素に対して f を呼び出し、入力ごとに1つの要素として結果をリストで返します。
squares <- lapply(1:3, function(i) i^2)
print(length(squares))
print(squares[[3]])出力:
[1] 3
[1] 9sapply()も同じ処理を行い、結果を簡潔にします。すべての呼び出しが1つの値を返す場合、リストではなく通常のベクトルが得られます。
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これらの関数は、結果を一度に1つの要素ずつ構築するループを置き換えます。以下の2つのバージョンは、どちらも各単語に含まれる母音の数を計算します:
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チャレンジ
簡単vowel_counts(words)を完成させてください。各単語につき1行、単語内の母音(a、e、i、o、u)の数を含むbanana: 3の形式で返します。すべての単語の母音を数えるにはsapply()を使用してください。
用意されたコードは、カンマ区切りの小文字の単語の行として単語を読み込み、返された各行を出力します。
自分で試してみよう
vowel_counts <- function(words) {
# ここにコードを書いてください
character(0)
}
# 提供された入出力コード: そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
cat(vowel_counts(strsplit(input[1], ",")[[1]]), sep = "\n")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ