如何使用保留空白的向量对多路数组进行子索引



作为一个最小的例子,让我们考虑以下多路数组(a(:

a = as.table(array(c(1:8), dim=c(2,2,2)))

对于此数组,手动子指示很容易,例如

a[1,,](符合状态 1 的维度 1 的 2 x 2 矩阵 (A((

我现在的问题是; 我怎样才能用保留空白的向量做同样的事情,例如c(1,,).

请注意,我需要根据实例中观察到的变量定义哪些尺寸留空(动态(;我最初的想法是一个通用的茶。向量 b=c(",","( ,如果观察到变量 1 在状态 1 中,我可以用 1 替换它,例如 b[1]="1",但是,首先,我不知道如何使用这个向量来指示 a["b"],或者是否有更好的方法来做到这一点。

我需要这个动态指示,因为我想在收到证据时更新表格的某些部分(信息 == 计数(

提前非常感谢!

最好 塞巴斯蒂安

以下是我的做法:

while (evidence) {
idx <- lapply(dim(a), function (dimsize) 1:dimsize)
## update `idx` according to `evidence`, e.g.,
## if you want to do `a[1,,2]`
idx[[1]] <- 1
idx[[3]] <- 2
do.call(`[`, c(list(a), idx))
## if you want to do `a[1,,2] <- c(20, 30)`
a <- do.call(`[<-`, c(list(a), idx, list(value=c(20, 30))))
}

这是一个解决它的肮脏方法:

数据:

a = as.table(array(c(1:8), dim=c(2,2,2)))

你的动态索引应该是一个文本:(这是一个新问题,你如何将你的条件变成一个字符串,如indexindex2(

index  = "1,,"
index2 = ",2,"

功能:

crazyIndexing <- function(obj, index) {
stringExpr = paste0(obj, "[",index,"]")
return(eval(parse(text=stringExpr)))
}

调用你的函数:(看看它是如何做到的!

a[1,,]
crazyIndexing("a",index)
a[,2,]
crazyIndexing("a",index2)

请注意:

b=c("","",""); b[1]="1"
index = paste0(b, collapse = ",")
#[1] "1,,"

当然,您可以相应地更改函数:

crazyIndexing2 <- function(obj, obj2, index) {
stringExpr = paste0(obj ,"[",index,"]", "<-", obj, "[",index,"]", "+", obj2)
eval(parse(text=stringExpr))
return( get(obj) )
}
a = as.table(array(c(1:8), dim=c(2,2,2)))
aa = a[,2,]
aopt = crazyIndexing2("a","aa","1,,")

现在您拥有所有工具。

最新更新