R言語で、リストまたはベクトルの各要素とそのインデックスに関数を適用する方法について解説します。ここではtidyverseパッケージに含まれているpurrrパッケージのiwalk()を使用した方法についてお伝えします。
iwalk()の概要
iwalk()は、リストまたはベクトルの各要素とそのインデックスに関数を適用するための関数です。戻り値がないことに注意してください。
iwalk()の使い方
iwalk(.x, .f, ...)
iwalk()の引数
.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 = ","))
これにより、どの引数がどの関数に属しているかがわかりやすくなり、エラーメッセージもわかりやすくなります。
iwalk()の戻り値
ありません。
準備
あらかじめ、tidyverseパッケージを読み込んでおきます。
library(tidyverse)
使用例
リストに含まれているデータフレームをCSV保存するには次のようにします。
x <- list(
A = data.frame(A1 = 1:5, A2 = letters[1:5]),
B = data.frame(B1 = 5:10, B2 = letters[5:10])
)
iwalk(x, \(x, idx) write.csv(x, paste(idx, ".csv", sep = "")))