4

f次のような関数が欲しい

(outer(X, Y, f))[i, j]Xのi番目の要素とYのj番目の要素を並べて連結したものc(X[i], Y[j])です。

さらに、この結果は、プロセスを繰り返すことができるようなものにしたいと思います。このようにして、次のようになります。

(outer(outer(X, Y, f), Z, f))[i, j, k]は、Xのi番目の要素、Yのj番目の要素、およびZのk番目の要素を並べて連結したものですc(X[i], Y[j], Z[k])

最終的に、私は次のような関数を定義することを目指しています。

foo <- function(a.list) {
  Reduce(function(x, y) outer(x, y, f), a.list)
}

そのような、

A <- foo(list(v_1, ..., v_p))

その後dim(A)、、、c(length(v_1), ..., length(v_p))_

A[i_1, ..., i_p] == c(v_1[i_1], ..., v_p[i_p])

すべての有効なインデックスセット(i_1、...、i_p)。

例えば:

> foo(list(LETTERS[1:2], c(3, 4, 5), letters[6:7]))
, , 1

               [,1]           [,2]           [,3]
[1,] c("A", 3, "f") c("A", 4, "f") c("A", 5, "f")
[2,] c("B", 3, "f") c("B", 4, "f") c("B", 5, "f")

, , 2

               [,1]           [,2]           [,3]
[1,] c("A", 3, "g") c("A", 4, "g") c("A", 5, "g")
[2,] c("B", 3, "g") c("B", 4, "g") c("B", 5, "g")

:上記の例に示されている結果のようなベクトルの配列がRでも有効/可能かどうかはわかりませんがc("A", 3, "f")、要素が「A」であるベクトルのようなオブジェクトを提案するような式を使用しています。 3、および「f」'。)

これを達成するためにfに何を使用できますか?

ありがとう!

4

1 に答える 1

5

関数Vectorize()はここであなたの友達です:次のように定義fします:

f <- Vectorize( function(a,b) c(as.list(a), as.list(b)), SIMPLIFY = FALSE )

foo次に、(上記の定義を使用して)次のことを実行できます。

z <- foo(list(LETTERS[1:2], c(3, 4, 5), letters[6:7]))

たとえば、エントリが上記の例と一致することを確認できます。

> z
, , 1

     [,1]   [,2]   [,3]  
[1,] List,3 List,3 List,3
[2,] List,3 List,3 List,3

, , 2

     [,1]   [,2]   [,3]  
[1,] List,3 List,3 List,3
[2,] List,3 List,3 List,3

> z[2,2,2]
[[1]]
[[1]][[1]]
[1] "B"

[[1]][[2]]
[1] 4

[[1]][[3]]
[1] "g"
于 2011-05-31T17:34:25.057 に答える