R bnlearn内部函数评估 [英] R bnlearn eval inside function

查看:153
本文介绍了R bnlearn内部函数评估的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在R中使用bnlearn包来训练贝叶斯网络.我对以下代码(稍作修改的bnlearn示例代码)感到烦恼:

I am using the bnlearn package in R to train a Bayesian network. I have troubles with the following code (slightly modified bnlearn example code):

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()

此代码引发错误:

包装时出错:无法将类型'closure'强制转换为类型为'character'的向量

但是,如果在函数myfuncBN()之外定义了str和str2,则可以使用. 有人知道原因吗?

It works however if str and str2 are defined outside the function myfuncBN(). Does anyone know the reason for this?

推荐答案

以下是该问题的解决方案:

Here is a solution to the problem:

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

这篇关于R bnlearn内部函数评估的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆