R言語で、リストまたはベクトルの各要素とそのインデックスに関数を適用しリストを返す方法について解説します。ここではtidyverseパッケージに含まれているpurrrパッケージのimap()を使用した方法についてお伝えします。
imap()の概要
imap()は、リストまたはベクトルの各要素とそのインデックスに関数を適用しリストを返すための関数です。imap(x, …)はインデックス付きマップで、xに名前がある場合はmap2(x, names(x), …)の省略形、名前がない場合はmap2(x, seq_along(x), …)の省略形です。これは、要素の値と位置の両方を計算する必要がある場合に便利です。
imap()の使い方
imap(.x, .f, ...)
imap()の引数
.x
リストまたはベクトルを指定します。
.f
関数を指定します。
以下のいずれかの方法で指定します。
- 名前付き関数(例:paste)
- 無名関数(例:「\(x, idx) x + idx」または「function(x, idx) x + idx」)
- 数式(例:~ .x + .y)。現在の要素を参照するには.xを使用し、現在のインデックスを参照するには.yを使用する必要があります。Rの旧バージョンとの後方互換性が必要な場合のみ推奨されます。
…
関数に渡される追加の引数を指定します。
.fに追加の(定数)引数を渡す際に…を使用することは、現在では一般的に推奨されていません。代わりに、省略形の匿名関数を使用してください。
# 下記の代わりに
x |> map(f, 1, 2, collapse = ",")
# 以下のようにしてください。
x |> map(\(x) f(x, 1, 2, collapse = ","))
これにより、どの引数がどの関数に属しているかがわかりやすくなり、エラーメッセージもわかりやすくなります。
imap()の戻り値
.x と同じ長さのリストを返します。
準備
あらかじめ、tidyverseパッケージを読み込んでおきます。
library(tidyverse)
使用例
名前付きベクトルにimap()を適用すると次のようになります。
x <- c(1, 2, 3)
names(x) <- c("first", "second", "third")
imap(x, \(x, idx) paste(idx, x, sep = ":"))
$first
[1] "first:1"
$second
[1] "second:2"
$third
[1] "third:3"