作为一个最小的例子,让我们考虑以下多路数组(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)))
你的动态索引应该是一个文本:(这是一个新问题,你如何将你的条件变成一个字符串,如index
,index2
(
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,,")
现在您拥有所有工具。