2017-06-21 1 views
3

J'utilise le paquetage bnlearn dans R pour former un réseau bayésien. J'ai des problèmes avec le code suivant (code bnlearn exemple légèrement modifié):R bnlearn eval inside function

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

Ce code lance l'erreur:

Erreur lors wrapup: ne peut pas forcer le type 'fermeture' au vecteur de type 'caractère'

Cela fonctionne cependant si str et str2 sont définis en dehors de la fonction myfuncBN(). Est-ce que quelqu'un sait la raison de ceci?

Répondre

1

Voici une solution au problème:

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 

Cette valeur est égale au résultat donné par:

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

# [1] 0.05940594 
+0

Merci, travaille pour moi! – Jam