在R中转换向量为数组索引?

问题描述 投票:0回答:1

假设我们有一个数组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有多少维度都能工作呢?

r arrays multidimensional-array
1个回答
3
投票

我们可以使用 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))

2
投票

您可以利用 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
© www.soinside.com 2019 - 2024. All rights reserved.