2012-07-17 10 views

Respuesta

3

Siguiendo en la respuesta de @ttmaccer: esto funciona debido al párrafo (ligeramente) oscuro en ?"[" que dice:

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’. 

El efecto de usar t(ii) en

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

es convertir ii a una matriz de 1x4 que [ interpreta como una matriz como se describió anteriormente; a[matrix(ii,nrow=1)] sería más explícito pero menos compacto.

Lo bueno de este enfoque (además de evitar los aspectos mágicos de apariencia de do.call) es que funciona en paralelo durante más de un conjunto de índices, como en

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

Gracias por la expansión de @ respuesta de ttmacer . Muy agradable. –

2

Si he entendido bien su pregunta, esta construcción, el uso de do.call(), debe hacer lo que quiera:

## 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 llamada anterior funciona, porque los siguientes son todas equivalentes:

a[5, 5, 5, 5] 
`[`(a, 5, 5, 5, 5) 
do.call("[", list(a, 5, 5, 5, 5)) 
do.call("[", c(list(a), ii)) 
Cuestiones relacionadas