論理の流刑地

地獄の底を、爆笑しながら闊歩する

【小ネタ】Reduce()はベクトル以外(配列、行列、ベクトルのリスト)にも使える

たぶん自分だけが知らなかったようなことだけど、はえーってなったので備忘。

Intoduction

前の記事にあるように、テンソルをrTensorパッケージを使いあれこれいじっていた。
期待度数を要素に持つようなテンソルをどうやって作るかなって考えたときに、まぁ普通に関数をつくることを考える。
周辺度数のベクトルを返す関数を作るのは簡単だが、テンソルの次元が不定なときに、各次元の周辺度数のベクトルの外積により期待度数のテンソル*1をつくるのはどうするんだっていう課題があった。

  1. do.callはだめでもReduceだとうまくいくときがある
  2. Reduceの対象にlistを噛ませることで、ベクトルや配列、行列も使える

これが要点

How to

例えば以下のように三つベクトルがあって、その外積から三次元配列をつくるってとき、

vec1 <- 1:4
vec2 <- 1:3
vec3 <- c(1,2,1)
vec_list <- list(vec1, vec2, vec3)

do.callで外積をつくろうとするとErrorが吐かれる

do.call(what =outer , args=vec_list)
#Error in match.fun(FUN) : 
#  'structure(1:3, .Dim = c(1L, 3L))' は関数、文字、またはシンボルではありません 

しかしReduceだとうまくいく

Reduce(outer , vec_list)
# 
# , , 1
# 
# [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    2    4    6
# [3,]    3    6    9
# [4,]    4    8   12
# 
# , , 2
# 
# [,1] [,2] [,3]
# [1,]    2    4    6
# [2,]    4    8   12
# [3,]    6   12   18
# [4,]    8   16   24
# 
# , , 3
# 
# [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    2    4    6
# [3,]    3    6    9
# [4,]    4    8   12
# 

Enjoy!

*1:というかその前段階の配列