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?
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