假设我有一个名为 的多维数组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]
是否有一种简短、有效且希望优雅的方式来做到这一点?
假设我有一个名为 的多维数组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]
是否有一种简短、有效且希望优雅的方式来做到这一点?
利用鲜为人知的用法[
:
[
当通过单个参数索引数组时,i
可以是一个矩阵,其列数与x
;的维数一样多。结果是一个向量,其元素对应于 的每一行中的索引集i
。
你可以简单地做:
pi[matrix(indexes, 1)]
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 ...
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