【问题标题】:R bnlearn eval inside functionR bnlearn eval 内部函数
【发布时间】:2017-11-24 09:09:23
【问题描述】:

我正在使用 R 中的 bnlearn 包来训练贝叶斯网络。我对以下代码有问题(稍微修改了 bnlearn 示例代码):

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

此代码抛出错误:

包装期间出错:无法将“闭包”类型强制转换为“字符”类型的向量

但是,如果 str 和 str2 在函数 myfuncBN() 之外定义,它会起作用。 有人知道这是什么原因吗?

【问题讨论】:

    标签: r bayesian bnlearn


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 2019-03-20
      • 2013-10-16
      相关资源
      最近更新 更多