R bnlearn eval inside a function

I am using the bnlearn package in R to train a Bayesian network. I'm having trouble 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 an error:

Wrapping error: cannot force type "close" to a vector of type "character"

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

+3


source to share


1 answer


Here is the 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:

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

# [1] 0.05940594

      

+1


source







All Articles