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

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

map()の概要

map()は、リストまたはベクトルの各要素に関数を適用しリストを返すための関数です。map()は常にリストを返します。入力と同じ型のオブジェクトを返すバージョンについては、modify()ファミリーを参照してください。

map()の使い方


map(.x, .f, ..., .progress = FALSE)

map()の引数

.x

リストまたはベクトルを指定します。

.f

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

  • 名前付き関数(例:mean)
  • 無名関数(例: ⁠\(x) x + 1⁠ または function(x) x + 1
  • 数式(例:~ .x + 1)。最初の引数を参照するには .x を使用する必要があります。非推奨となりました。
  • 文字列、整数、またはリスト(例:”idx”, 1、list(“idx”, 1))は、それぞれ ⁠\(x) pluck(x, “idx”)⁠、⁠\(x) pluck(x, 1)⁠、⁠\(x) pluck(x, “idx”, 1)⁠ の省略形です。必要に応じて、インデックス指定要素が NULL または存在しない場合にデフォルト値を設定するために .default を指定します。

[試験的]

関数をin_parallel()でラップして、並列実行を宣言します。詳細はin_parallel()を参照してください。このコンテキストでは … の使用は許可されていません。

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


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

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

.progress = FALSE

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

map()の戻り値

リストを返します。.f()は任意の型を返すことができます。.fによってスローされるエラーは、purrr_error_indexedクラスのエラーにラップされます。

準備

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


library(tidyverse)

使用例

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


x <- c(1, 2, 3)
map(x, \(x) x^2)

[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 9