Menu
Coddy logo textTech

Mapとmapply

CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 33/64。

Map(f, xs, ys)は2つ以上のベクトルを同時に走査し、それぞれから1つずつ要素を取り出してfを呼び出します。まず最初の要素同士、次に2番目の要素同士というように処理します。戻り値はリストです:

totals <- Map(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5))
print(length(totals))
print(totals[[3]])

出力:

[1] 3
[1] 7.5

mapply()は簡略化されたバージョンで、複数のベクトルに対するsapply()のようなものです。unlist()はMap()からのリストをベクトルに平坦化することもできます。

print(mapply(function(q, p) q * p, c(2, 1, 3), c(4, 12, 2.5)))
print(unlist(Map(function(a, b) a + b, 1:3, 4:6)))

出力:

[1]  8.0 12.0  7.5
[1] 5 7 9

ベクトルは位置によって対応付けられるため、同じ長さでなければなりません。mapply()は最初のベクトルに従ってテキスト結果に名前を付けます。USE.NAMES = FALSEはその名前を削除します。

items <- c("tea", "jam")
qty <- c(2, 3)
labels <- mapply(function(i, q) paste(q, "x", i), items, qty, USE.NAMES = FALSE)
print(labels)

出力:

[1] "2 x tea" "3 x jam"

各ペアにifが必要な場合は、複数の引数を受け取る関数を書き、それをmapply()に渡します。条件はペアごとに1回実行されます:

describe <- function(name, age) {
  group <- if (age < 18) "minor" else "adult"
  paste0(name, " (", group, ")")
}
print(mapply(describe, c("Ada", "Tim"), c(36, 12), USE.NAMES = FALSE))

出力:

[1] "Ada (adult)" "Tim (minor)"
challenge icon

チャレンジ

簡単

order_lines(items, qty, prices)を完成させてください。各アイテムにつき1行を返します。2 x tea = 8.00の形式で、数量、 x 、アイテム、 = 、および数量と価格の積を小数点以下2桁で表示します。mapply()またはMap()を使用してください。

用意されたコードは、アイテム、数量、価格をそれぞれカンマ区切りの3行として読み込み、返された各行を出力します。

自分で試してみよう

order_lines <- function(items, qty, prices) {
  # ここにコードを書いてください
  character(0)
}

# 提供された入出力コード: そのままにしておいてください
input <- suppressWarnings(readLines(file("stdin")))
cat(order_lines(strsplit(input[1], ",")[[1]], as.numeric(strsplit(input[2], ",")[[1]]), as.numeric(strsplit(input[3], ",")[[1]])), sep = "\n")
quiz icon腕試し

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

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

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