Menu
Coddy logo textTech

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] 9

sapply()も同じ処理を行い、結果を簡潔にします。すべての呼び出しが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
challenge icon

チャレンジ

簡単

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")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Rオンラインコンパイラ