2012-06-02 27 views
13
的載體得到多維數組的值

比方說,我有一個多維數組叫pi,它的維數是不知道,直到運行時:的R - 如何通過指數

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

正如您所見,尺寸計數取決於dim_count。當我有一個索引向量時,如何從數組中檢索值?例如,當我有:

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

我想要檢索

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

是否有這樣做的一個簡短,有效,並希望優雅的方式?

回答

13

利用的[一個鮮爲人知的用法:

當通過[索引數組時,單個參數i可以是具有與x的尺寸一樣多的列的矩陣;那麼結果是一個矢量,其元素對應於i的每一行中的索引組。

,你可以簡單地做:

pi[matrix(indexes, 1)] 
+0

+1 Hooray矩陣索引! – Aaron

9

do.call("[",...)似乎工作。

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

請注意,你的榜樣是行不通的 - 你的尺寸都是3,但你的一些指標元素均> 3 ...

+0

呀,具體的例子是部分組成,顯示最小顯著一段代碼,我沒有注意到它:) – nietaki

+0

哦,你是有點快比我在這裏。 +1。 –

4

do.call()是一個選項:

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

哪給出:

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

棘手的一點是得到正確格式的參數列表。 pi應該是"["(或命名爲參數x,參見?"[")的第一個參數,同時我們希望indexes本身的每個元素都是提供的列表的組件,而不是該列表中的矢量。因此,令人費解的c(list(x = pi), as.list(indexes))

構建,這可能是更容易跟蹤參數列表的替代方法是:

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

這給

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