R×purrr::map2 2つのリストまたはベクトルの各要素に関数を適用しリストを返す

R言語で、2つのリストまたはベクトルの各要素に関数を適用しリストを返す方法について解説します。ここではtidyverseパッケージに含まれているpurrrパッケージのmap2()を使用した方法についてお伝えします。

map2()の概要

map2()は、2つのリストまたはベクトルの各要素に関数を適用しリストを返すための関数です。この関数は、一度に2つの引数を反復処理するmap()のバリエーションです。

map2()の使い方


map2(.x, .y, .f, ..., .progress = FALSE)

map2()の引数

.x, .y

リストまたはベクトルを指定します。
長さが異なる場合は、長さ1のリストまたはベクトルがもう一方の長さに再利用されます。

.f

関数を指定します。
以下のいずれかの方法で指定します。

  • 名前付き関数(例:mean)
  • 無名関数(例: ⁠ ⁠\(x, y) x + y⁠ または function(x, y) x + y
  • 数式(例:~ .x + .y)。xの現在の要素を参照するには.xを使用し、yの現在の要素を参照するには.yを使用する必要があります。現在は推奨されません。

[試験的]
関数を並列処理することを宣言するには、in_parallel()でラップします。詳細はin_parallel()を参照してください。このコンテキストでは…の使用は許可されていません。

関数に渡される追加の引数を指定します。
.fに追加の(定数)引数を渡す際に…を使用することは、現在では一般的に推奨されていません。代わりに、省略形の匿名関数を使用してください。


# 下記の代わりに
x |> map(f, 1, 2, collapse = ",")
# 以下のようにしてください。
x |> map(\(x) f(x, 1, 2, collapse = ","))

これにより、どの引数がどの関数に属しているかがわかりやすくなり、エラーメッセージもわかりやすくなります。

.progress = FALSE

プログレスバーを表示するかどうかを指定します。
TRUEを指定すると基本的なプログレスバーが表示されます。文字列で名前を付けることもできます。詳細についてはprogress_barsを参照してください。

map2()の戻り値

リストを返します。.f()は任意の値を返すことができます。

準備

あらかじめ、tidyverseパッケージを読み込んでおきます。


library(tidyverse)

使用例

2つのベクトルにmap2()を適用すると次のようになります。


x <- c(2, 5, 10)
y <- c(1, 2, 3)
map2(x, y, \(x, y) x ^ y)

[[1]]
[1] 2

[[2]]
[1] 25

[[3]]
[1] 1000