作为一个最小的示例,让我们考虑以下多路数组(a):
a = as.table(array(c(1:8), dim=c(2,2,2)))
对于此数组,手动子指示很容易,例如
a[1,,]
(符合维度1的2 x 2矩阵处于状态1(A))
我的问题是现在;我如何用保留空白的向量做同样的事情,例如类似于c(1,,)
。
请注意,我需要根据实例中观察到的变量来定义哪些尺寸(动态地)保留为空白;我最初的想法是通用。向量b = c(“”,“”,“”),如果在状态1中观察到变量1,则可以将其替换为1。 b [1] =“ 1”,但是,首先,我不知道如何使用此向量表示a [“ b”],或者是否有更好的方法来实现此目的。
我需要这种动态指示,因为我想在收到证据(信息==计数)时更新表的各个部分
非常感谢您!
最好, 塞巴斯蒂安
答案 0 :(得分:0)
这是解决问题的肮脏方法:
数据:
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,,")
现在您拥有了所有工具。
答案 1 :(得分:0)
这是我要怎么做:
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))))
}