我有一个概率表存储为数组(由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]
,但我想避免使用该方法。
答案 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