2017-06-21 72 views
3

我使用R中的bnlearn包来训练贝叶斯网络。我用下面的代码(略有修改bnlearn例如代码)的烦恼:R bnlearn eval函数内部

library(bnlearn) 
data(learning.test) 
fitted = bn.fit(hc(learning.test), learning.test) 

myfuncBN=function(){ 

    var = names(learning.test) 
    obs = 2 
    str = paste("(", names(learning.test)[-3], "=='", 
      sapply(learning.test[obs,-3], as.character), "')", 
      sep = "", collapse = " & ") 
    str2 = paste("(", names(learning.test)[3], "=='", 
      as.character(learning.test[obs, 3]), "')", sep = "") 
    cpquery(fitted, eval(parse(text = str2)), eval(parse(text = str))) 
} 

myfuncBN() 

此代码引发错误:不能强制类型“闭合”到类型“字符”的矢量:收卷过程中

错误

但是,如果在函数myfuncBN()外定义了str和str2,它就可以工作。 有谁知道这个的原因?

回答

1

这是解决问题的办法:

library(bnlearn) 
data(learning.test) 
fitted = bn.fit(hc(learning.test), learning.test) 

myfuncBN=function() { 
    vars = names(learning.test) 
    obs = 2 
    str1 = paste("(", vars[-3], "=='", 
      sapply(learning.test[obs,-3], as.character), "')", 
      sep = "", collapse = " & ") 
    str2 = paste("(", vars[3], "=='", 
      as.character(learning.test[obs, 3]), "')", sep = "") 

    eval(parse(text=paste("cpquery(fitted,",str2,",",str1,")"))) 
} 

set.seed(1) 
myfuncBN() 

# [1] 0.05940594 

此值等于结果由下式给出:

set.seed(1) 
cpquery(fitted, event=(C=="c"), 
      evidence=((A=="b") & (B=="a") & (D=="a") & (E=="b") & (F=="b"))) 

# [1] 0.05940594 
+0

谢谢,对我的作品! – Jam