15

假设我有一个名为 的多维数组pi,直到运行时才知道它的维数:

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]

是否有一种简短、有效且希望优雅的方式来做到这一点?

4

3 回答 3

17

利用鲜为人知的用法[

[当通过单个参数索引数组时,i可以是一个矩阵,其列数与x;的维数一样多。结果是一个向量,其元素对应于 的每一行中的索引集i

你可以简单地做:

pi[matrix(indexes, 1)]
于 2012-10-03T02:11:45.450 回答
10

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

于 2012-06-02T19:47:44.727 回答
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
于 2012-06-02T20:03:53.547 回答