2012-06-02 27 views
13

Powiedzmy mam wielowymiarową tablicę o nazwie pi, a jego liczba wymiarów nie jest znana do wykonywania:R - jak uzyskać wartość wielowymiarowej macierzy przez wektor wskaźników

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

Jak widać, liczba wymiarów zależy od dim_count. Jak pobrać wartość z tablicy, gdy mam wektor indeksów? Na przykład jeśli mam:

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

Chcę odzyskać

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

Czy istnieje krótki, skuteczny i mam nadzieję, elegancki sposób to zrobić?

Odpowiedz

13

wykorzystanie mało znany wykorzystania [:

Podczas indeksowania tablic przez [ pojedynczy argument i może być macierz z tylu kolumn, ile jest wymiarów x; wynikiem jest wektor z elementami odpowiadającymi zestawom indeksów w każdym wierszu i.

można po prostu zrobić:

pi[matrix(indexes, 1)] 
+0

+1 Brawo dla indeksowania macierzy! – Aaron

9

do.call("[",...) wydaje się działać.

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

pamiętać, że przykład nie będzie działać - Twoje wymiary były 3, ale niektóre elementy indeksu były> 3 ...

+0

tak, konkretny przykład częściowo składa się pokazać najmniejszą znaczący kawałek kodu, a ja go nie zauważyć :) – nietaki

+0

Och, były nieco szybciej niż ja tutaj. +1. –

4

do.call() jest opcja:

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

Co daje:

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

tricky bitowy jest coraz listę argumentów w odpowiednim formacie. pi powinien być pierwszym argumentem dla "[" (lub nazwanym jako argument x, patrz ?"["), podczas gdy chcemy, aby każdy element z indexes był składnikiem dostarczonej listy, a nie wektorem na tej liście. Stąd zawiły c(list(x = pi), as.list(indexes)).

Alternatywnym sposobem skonstruować listę argumentów, które mogłyby być łatwiejsze do naśladowania jest:

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

co daje

> do.call("[", ARGS) 
[1] 202 
> pi[1, 2, 2, 2, 3] 
[1] 202 
Powiązane problemy