假设我们有一个数组A,它的维数是任意的dim(A)。假设我们有一个坐标索引向量V,有什么方法可以访问A中坐标为V的元素吗?做类似A[V]这样的事情显然是不行的。如果V=c(1,2,3),那么A[V]只会给我们A的第1、2、3个元素,如果我们想要A[1,2,3]呢?如果我们提前知道dim(A),这显然很容易。但是,如果我们想让代码无论A有多少维度都能工作呢?
我们可以使用 do.call
执行 `[`
.
v <- c(1, 2, 3)
do.call(`[`, c(list(A), v))
# [1] 22
要分配我们有 `[<-`
.
A <- do.call(`[<-`, c(list(A), v, 99))
检查。
A[,,3]
# , , 3
#
# [,1] [,2] [,3]
# [1,] 19 99 25
# [2,] 20 23 26
# [3,] 21 24 27
使用 @duckmayr的 A
A <- array(1:(3^3), dim = c(3, 3, 3))
您可以利用 eval(parse())
,像这样。
foo <- function(A, v) {
stopifnot(length(v) == length(dim(A)))
idx <- paste(v, collapse = ", ")
return(eval(parse(text = paste0("A[", idx, "]"))))
}
A <- array(1:(3^3), dim = c(3, 3, 3))
v <- c(1, 2, 3)
foo(A, v)
# [1] 22
A[1, 2, 3]
# [1] 22
在评论中,你还问了关于赋值的问题;看起来你已经解决了这个问题,但如果你或其他人觉得有用的话,你可以使用一个替换函数。
`foo<-` <- function(A, v, value) {
stopifnot(length(v) == length(dim(A)))
stopifnot(is.atomic(value) & length(value) == 1)
idx <- paste(v, collapse = ", ")
eval(parse(text = paste0("A[", idx, "] <- value")))
return(A)
}
foo(A, v) <- 2
foo(A, v)
# [1] 2