2012-06-02 14 views
13

Diciamo Ho una matrice multidimensionale chiamato pi, e il suo numero di dimensioni non è noto fino alla fase di esecuzione:R - come ottenere un valore di un array multidimensionale da un vettore di indici

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

Come si può vedere il conteggio delle dimensioni dipende da dim_count. Come posso recuperare un valore dall'array quando ho un vettore degli indici? Per esempio, quando ho:

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

voglio recuperare

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

Esiste un modo breve, efficace e, si spera elegante di fare questo?

risposta

13

Facendo uso di un po 'di uso conosciuto di [:

Quando si indicizzano gli array per [ un singolo argomento i può essere un matrice con tante colonne quante sono le dimensioni di x; il risultato è quindi un vettore con elementi corrispondenti all'insieme di indici in ciascuna riga di i.

si può semplicemente fare:

pi[matrix(indexes, 1)] 
+0

+1 Hooray per l'indicizzazione della matrice! – Aaron

9

do.call("[",...) sembra funzionare.

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

Nota che il vostro esempio non avrebbe funzionato - le vostre dimensioni erano tutti e 3, ma alcuni dei vostri elementi dell'indice sono stati> 3 ...

+0

sì, l'esempio particolare è stata in parte composto per mostrare il più piccolo pezzo significativo di codice e non ho notato che :) – nietaki

+0

Oh, tu eri un po 'più veloce di me qui. +1. –

4

do.call() è un'opzione:

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

che dà:

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

la parte difficile è sempre la lista degli argomenti nel formato giusto. pi dovrebbe essere il primo argomento a "[" (o denominato come argomento x, vedere ?"["), mentre vogliamo che ogni elemento di indexes stesso sia un componente dell'elenco fornito, non un vettore all'interno di tale elenco. Da qui il contorto c(list(x = pi), as.list(indexes)).

Un modo alternativo per costruire la lista di argomenti che potrebbe essere più facile da seguire è:

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

che dà

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