在数组中查找具有任意维度

时间:2015-10-07 17:35:48

标签: r

我有一个概率表存储为数组(由bnlearn输出)。维度的数量始终等于父母的数量+ 1.我总是想要获取第一个维度,其余维度的dimnames存储在下面的vals中。

现在,我正在这样做:

vals = avatar[cpt$parent] # c('a','b')
eval_str = paste( "cpt$prob[,\'"
                , paste(vals, collapse="\',\'")
                , "\']", sep=""
                )
row = eval(parse(text=eval_str))

在三维情况下,代码可以证明:row=cpt$prob[,'a','b']

关于如何在不使用eval的情况下执行此操作的任何想法?

进一步说明

我想通过变量将数组子集化,其中索引为subset by。例如:

a1 <- array(1:81, c(3,3,3,3))

我可以直接使用a1[,2,2,3]进行子集获取67 68 69。但如果我有变量vals <- c(2,2,3)并尝试a1[,vals],我会收到错误消息。或者,如果我尝试a1[vals],它将评估为等效a1[c(2,2,3)]

我也尝试了do.call,因为它允许do.call('[', ...)。或mapply(function(...) a1[...], ..)无济于事。

我希望有一个基于这些变量的索引和子集。但不是像往常那样的立场。

问题似乎出现在'[' x[i, j, ...]的参数结构中。我正在寻找由外部变量提供的j...

目前,我使用eval(parse(..方法指定间距和逗号位置。然后,我可以将a1[,vals]转换为a1[,2,2,3],但我想避免使用该方法。

1 个答案:

答案 0 :(得分:4)

据我了解,你有一个索引向量:

vals <- c(2, 2, 3)

您想知道如何将其转换为以下内容(不使用eval):

a1[,2,2,3]
# [1] 67 68 69

请注意,这与以下内容相同:

"["(a1, , 2, 2, 3)
# [1] 67 68 69

可以执行以下操作:

do.call("[", c(list(a1, substitute()), as.list(vals)))
# [1] 67 68 69