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

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

walk2()の概要

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

walk2()の使い方


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

walk2()の引数

.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 = ","))

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

ptype = NULL

NULL(デフォルト)の場合、出力型は結果の要素の共通型になります。それ以外の場合は、希望する出力型を示す「プロトタイプ」を指定してください。

.progress = FALSE

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

walk2()の戻り値

walk2()は入力.xを(非表示で)返します。これにより、パイプ内での使用が容易になります。.f()の戻り値は無視されます。

準備

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


library(tidyverse)

使用例

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


x <- c("ゆきや", "あられや", "ふってはふっては")
y <- c("こんこ", "こんこ", "ずんずんつもる")
walk2(x, y, \(x, y) write_lines(paste(x, y), "data.txt", append = TRUE))

data.txtを開くと次のようになっています。


ゆきや こんこ
あられや こんこ
ふってはふっては ずんずんつもる