構造を保つ

  • Rでリストは複雑な構造を持たせるのに便利。たとえば…
L.1 <- list(list(matrix(1:6,2,3),matrix(1:8,2,4)),list(1:5))
L.2 <- list(list(matrix(2:7,2,3),matrix(2:9,2,4)),list(2:6))
  • 末尾に示すように構造は同じ。この構造を保ったまま、対応する成分同士で演算をしたい
  • リストはベクトルなので、ベクトル化して演算するのが良さそう。apply()系の関数に何かある??
  • 見当たらないけれど、リスト構造を保持したままベクトルにunlist()することはできるそうだ
L.1.a <- as.relistable(L.1)
L.2.a <- as.relistable(L.2)
L.1.v <- unlist(L.1.a)
L.2.v <- unlist(L.2.a)
L12.v <- L.1.v+L.2.v
L.12 <- relist(L12.v)
> L.1
[[1]]
[[1]][[1]]
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

[[1]][[2]]
     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8


[[2]]
[[2]][[1]]
[1] 1 2 3 4 5


> L.2
[[1]]
[[1]][[1]]
     [,1] [,2] [,3]
[1,]    2    4    6
[2,]    3    5    7

[[1]][[2]]
     [,1] [,2] [,3] [,4]
[1,]    2    4    6    8
[2,]    3    5    7    9


[[2]]
[[2]][[1]]
[1] 2 3 4 5 6
> L.1.a <- as.relistable(L.1)
> L.2.a <- as.relistable(L.2)
> L.1.v <- unlist(L.1.a)
> L.2.v <- unlist(L.2.a)
> L12.v <- L.1.v+L.2.v
> L.12 <- relist(L12.v)

> L.12
[[1]]
[[1]][[1]]
     [,1] [,2] [,3]
[1,]    3    7   11
[2,]    5    9   13

[[1]][[2]]
     [,1] [,2] [,3] [,4]
[1,]    3    7   11   15
[2,]    5    9   13   17


[[2]]
[[2]][[1]]
[1]  3  5  7  9 11


attr(,"class")
[1] "relistable" "list"  
  • 足し算を関数にしてみる
relist.sum <- function(L1,L2){
	L1.a <- as.relistable(L1)
	L2.a <- as.relistable(L2)
	L1.v <- unlist(L1.a)
	L2.v <- unlist(L2.a)
	ret <- L1.v + L2.v
	return(relist(ret))
}
relist.sum(L.1,L.2)