15

という多次元配列がpiあり、その次元数は実行時までわからないとしましょう:

dims <- rep(3, dim_count)
pi <- array(0, dims)

ご覧のとおり、次元数は に依存しdim_countます。インデックスのベクトルがある場合、配列から値を取得するにはどうすればよいですか? たとえば、次の場合:

dim_count <- 5
indexes <- c(1, 2, 3, 3, 3)

回収したい

pi[1, 2, 3, 3, 3]

これを行うための短く、効果的で、できればエレガントな方法はありますか?

4

3 に答える 3

17

のあまり知られていない使い方を利用する[:

[単一の引数で配列にインデックスを付ける場合i、 の次元と同じ数の列を持つ行列にすることができますx。結果は、 の各行のインデックスのセットに対応する要素を持つベクトルですi

あなたは簡単に行うことができます:

pi[matrix(indexes, 1)]
于 2012-10-03T02:11:45.450 に答える
10

do.call("[",...)動作するようです。

indexes <- c(1,2,3,3,3)
pi[1,2,3,3,3] <- 17  ## so we know if we succeeded or not
do.call("[",c(list(pi),as.list(indexes)))

あなたの例はうまくいかないことに注意してください-次元はすべて3でしたが、いくつかのインデックス要素は> 3でした...

于 2012-06-02T19:47:44.727 に答える
4

do.call()オプションです:

dim_count <- 5
indexes <- c(1, 2, 2, 2, 3)
dims <- rep(3, dim_count)
pi <- array(seq_len(prod(dims)), dims)

do.call(`[`, c(list(x = pi), as.list(indexes)))

これにより、次のことが得られます。

> do.call(`[`, c(list(x = pi), as.list(indexes)))
[1] 202
> pi[1, 2, 2, 2, 3]
[1] 202

注意が必要なのは、正しい形式で引数のリストを取得することです。piの最初の引数にする必要があります"["(または引数として名前を付けますx。 を参照?"[")。一方、indexesそれ自体の各要素は、リスト内のベクトルではなく、指定されたリストのコンポーネントにする必要があります。したがって、複雑なc(list(x = pi), as.list(indexes)).

従うのがより簡単な引数リストを作成する別の方法は次のとおりです。

ARGS <- vector("list", length = dim_count + 1)
ARGS[[1]] <- pi
ARGS[2:length(ARGS)] <- indexes
do.call("[", ARGS)

を与える

> do.call("[", ARGS)
[1] 202
> pi[1, 2, 2, 2, 3]
[1] 202
于 2012-06-02T20:03:53.547 に答える