2012-07-17 7 views

risposta

3

In seguito su @ ttmaccer's answer: funziona a causa del paragrafo (leggermente) oscuro in ?"[" che legge:

When indexing arrays by ‘[’ a single argument ‘i’ can be a 
matrix with as many columns as there are dimensions of ‘x’; 
the result is then a vector with elements corresponding to 
the sets of indices in each row of ‘i’. 

L'effetto di utilizzare t(ii) in

ii <- c(5,5,5,5) 
a[t(ii)] 

è quello di convertire ii ad una matrice 1x4 che [ interpreta come matrice come sopra descritto; a[matrix(ii,nrow=1)] sarebbe più esplicito ma meno compatto.

La cosa bella di questo approccio (oltre ad evitare gli aspetti magico-apparente di do.call) è che funziona in parallelo per più di una serie di indici, come in

jj <- matrix(c(5,5,5,5, 
       6,6,6,6),byrow=TRUE,nrow=2) 
a[jj] 
## [1] 4445 5556 
+0

Grazie per l'espansione su @ risposta di ttmacer . Molto bella. –

2

Se ho capito bene la tua domanda, questo costrutto, utilizzando do.call(), dovrebbe fare quello che vuoi:

## Create an example array and a variable containing the desired index 
a <- array(1:1e4, dim = c(10, 10, 10, 10)) 
ii <- c(5, 5, 5, 5) 

## Use do.call to extract the desired element. 
do.call("[", c(list(a), ii)) 
# [1] 4445 

La chiamata sopra funziona perché i seguenti sono tutti equivalenti:

a[5, 5, 5, 5] 
`[`(a, 5, 5, 5, 5) 
do.call("[", list(a, 5, 5, 5, 5)) 
do.call("[", c(list(a), ii)) 
Problemi correlati