R bnlearn eval inside function
Asked Answered
T

1

4

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

This code throws the error:

Error during wrapup: cannot coerce type 'closure' to vector of type 'character'

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

Tellurate answered 21/6, 2017 at 12:43 Comment(0)
M
5

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

This value is equal to the result given by:

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

# [1] 0.05940594
Minstrelsy answered 22/6, 2017 at 0:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.