R言語で、リストの要素を再帰的に追加または変更、削除する方法について解説します。リストの操作は様々な方法がありますが、ここではtidyverseパッケージに含まれているpurrrパッケージのlist_modify()を使用した方法についてお伝えします。

list_modify()の概要

list_modify()は、リストの要素を名前または位置で再帰的に追加または変更、削除するするための関数です。

list_modify()の使い方

purrr::list_modify()の使い方は次になります。


list_modify(.x, ..., .is_node = NULL)

list_modify()の引数の意味

.x

変更するリストを指定します。

リストの新しい値を指定します。
値を削除するにはzap()を使用します。これらの値は、すべて名前付きかすべて名前なしのいずれかである必要があります。入力がすべて名前付きの場合、名前によって.xと一致します。すべて名前なしの場合、位置によって一致します。動的ドットがサポートされています。特に、置換値がリストに格納されている場合は、それを「⁠!!!」で結合できます。

.is_node = NULL

要素がノード(TRUEを返す)かリーフ(FALSEを返す)かを判断する述語関数を指定します。
デフォルト値NULLは、vctrs::vec_is_list()を使用して、単純なリストをノードとして扱い、その他すべて(データフレームや線形モデルなどのより豊富なオブジェクトを含む)をリーフとして扱います。リスト上に構築されたすべてのオブジェクトを再帰するには、is.list()を使用します。

準備

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


library(tidyverse)

解説のために、次のリストを使用します。


x <- list(
    x1 = 1:3,
    y1 = letters[1:5],
    z1 = list(
        x2 = 10:13,
        y2 = LETTERS[10:15]
      )
  )
x

$x1
[1] 1 2 3

$y1
[1] "a" "b" "c" "d" "e"

$z1
$z1$x2
[1] 10 11 12 13

$z1$y2
[1] "J" "K" "L" "M" "N" "O"

list_modify()で値を追加

リストに値を追加するには次のように新しい名前を指定します。


list_modify(x, a1 = "NEW")

$x1
[1] 1 2 3

$y1
[1] "a" "b" "c" "d" "e"

$z1
$z1$x2
[1] 10 11 12 13

$z1$y2
[1] "J" "K" "L" "M" "N" "O"


$a1
[1] "NEW"

リスト内のリストに値を追加するには次のように新しい名前を指定します。


list_modify(x, z1 = list(z2 =" NEW"))

$x1
[1] 1 2 3

$y1
[1] "a" "b" "c" "d" "e"

$z1
$z1$x2
[1] 10 11 12 13

$z1$y2
[1] "J" "K" "L" "M" "N" "O"

$z1$z2
[1] " NEW"

list_modify()で値を削除

リストの値を削除するには次のように削除したい名前にzap()を指定します。


list_modify(x, x1 = zap())

$y1
[1] "a" "b" "c" "d" "e"

$z1
$z1$x2
[1] 10 11 12 13

$z1$y2
[1] "J" "K" "L" "M" "N" "O"

リスト内のリストの値を削除するには次のように削除したい名前にzap()を指定します。


list_modify(x, z1 = list(x2 = zap()))

$x1
[1] 1 2 3

$y1
[1] "a" "b" "c" "d" "e"

$z1
$z1$y2
[1] "J" "K" "L" "M" "N" "O"

list_modify()で値を変更する

リストの値を変更するには次のように既存の名前に値を指定します。


list_modify(x, x1 = "MODIFIED")

$x1
[1] "MODIFIED"

$y1
[1] "a" "b" "c" "d" "e"

$z1
$z1$x2
[1] 10 11 12 13

$z1$y2
[1] "J" "K" "L" "M" "N" "O"

リスト内のリストの値を変更するには次のように既存の名前に値を指定します。


list_modify(x, z1 = list(x2 = "MODIFIED"))

$x1
[1] 1 2 3

$y1
[1] "a" "b" "c" "d" "e"

$z1
$z1$x2
[1] "MODIFIED"

$z1$y2
[1] "J" "K" "L" "M" "N" "O"
R×purrr::list_modify リストの要素を再帰的に追加または変更、削除する