2012-06-02 6 views
13

Lassen Sie uns sagen, ich habe ein mehrdimensionales Array pi genannt, und seine Anzahl der Dimensionen ist nicht bis zur Laufzeit bekannt:R - wie einen Wert eines durch einen Vektor von Indizes mehrdimensionales Array erhalten

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

Wie Sie sehen können, hängt die Dimensionszählung von dim_count ab. Wie erhalte ich einen Wert aus dem Array, wenn ich einen Vektor der Indizes habe? Zum Beispiel, wenn ich:

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

I

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

Gibt es eine kurze, effektive und hoffentlich elegante Art und Weise, dies zu tun abrufen möchten?

Antwort

13

Die Nutzung eines wenig bekannten Verwendung von [ gibt:

Bei der Indexierung von Arrays durch [ kann ein einzelnes Argument i ein sein Matrix mit so vielen Spalten, wie es Dimensionen von x gibt; das Ergebnis ist dann ein Vektor mit Elementen, die den Mengen von Indizes in jeder Reihe von i entsprechen.

Sie können einfach tun:

pi[matrix(indexes, 1)] 
+0

+1 Hurra für Matrix Indizierung! – Aaron

9

do.call("[",...) scheint zu arbeiten.

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))) 

Beachten Sie, dass Ihr Beispiel nicht funktionieren würde - Ihre Dimensionen alle 3 waren, aber einige Ihrer Indexelemente waren> 3 ...

+0

ja, das spezielle Beispiel wurde zum Teil aus dem kleinsten signifikanten Teil des Codes zu zeigen, und ich habe es nicht bemerkt :) – nietaki

+0

Oh, Sie waren etwas schneller als ich hier. +1. –

4

do.call() eine Option ist:

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))) 

Welche gibt:

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

der schwierige Bit ist die Liste der Argumente in das richtige Format zu bekommen. pi sollte das erste Argument zu "[" sein (oder als Argument x genannt, siehe ?"["), während wir wollen, dass jedes Element von indexes selbst eine Komponente der gelieferten Liste ist, kein Vektor innerhalb dieser Liste. Daher der verschachtelte c(list(x = pi), as.list(indexes)).

Eine alternative Möglichkeit, die Argumentliste zu konstruieren, die einfacher sein könnte, folgen ist:

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

die

> do.call("[", ARGS) 
[1] 202 
> pi[1, 2, 2, 2, 3] 
[1] 202 
Verwandte Themen