R×purrr::modify_if ベクトルの各要素に条件付きで関数を適用し入力と同じ型を返す

R言語で、ベクトルの各要素に条件付きで関数を適用し入力と同じ型を返す方法について解説します。ここではtidyverseパッケージに含まれているpurrrパッケージのmodify_if()を使用した方法についてお伝えします。

modify_if()の概要

modify_if()は、ベクトルの各要素に条件付きで関数を適用し入力と同じ型を返すための関数です。modify_if()は、述語を満たすxの要素のみを変更し、その他の要素は変更しません。

modify_if()の使い方


modify_if(.x, .p, .f, ..., .else = NULL)

modify_if()の引数

.x

リストまたはデータフレームを指定します。

.p

単一の述語関数、そのような述語関数を記述する式、または.xと同じ長さの論理ベクトルを指定します。
あるいは、.xの要素自体がオブジェクトのリストである場合は、内部リスト内の論理要素の名前を示す文字列を指定します。
.pがTRUEと評価される要素のみが変更されます。

.f

対応するマップ関数と同じ方法で指定される関数を指定します。

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


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

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

else = NULL

.pがFALSEを返す.xの要素に適用される関数を指定します。

modify_if()の戻り値

.xと同じクラスのオブジェクトを返します。

使用例

準備

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


library(tidyverse)

数値ベクトルにmodify_if()を適用する例

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


c(1, 12, 123) |>
  modify_if(
    \(x) x %% 2 == 0,
    \(x) x * 10)

[1]   1 120 123