2012-07-17 2 views

Répondre

3

Faisant suite sur la réponse de @ ttmaccer: cela fonctionne à cause du paragraphe (légèrement) obscur dans ?"[" qui se lit comme suit:

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'effet de l'utilisation dans t(ii)

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

est de convertir ii à une matrice 1x4 qui [ interprète comme une matrice, comme décrit ci-dessus; a[matrix(ii,nrow=1)] serait plus explicite mais moins compact.

La bonne chose au sujet de cette approche (en plus d'éviter les aspects magiques-semblant de do.call) est que cela fonctionne en parallèle pour plus d'un ensemble d'indices, comme dans

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

Merci pour l'expansion sur @ la réponse de ttmacer . Très agréable. –

2

Si cette construction, à l'aide do.call(), devrait faire ce que vous voulez que je comprends bien votre question,:

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

L'appel ci-dessus fonctionne parce que les éléments suivants sont tous équivalents:

a[5, 5, 5, 5] 
`[`(a, 5, 5, 5, 5) 
do.call("[", list(a, 5, 5, 5, 5)) 
do.call("[", c(list(a), ii)) 
Questions connexes