我在并行使用 R 包bnlearn
和sna
时遇到问题。以下示例很简单:
library(bnlearn)
data("asia")
# build network
a <- hc(asia)
# output
a
输出符合预期:
Bayesian network learned via Score-based methods
model:
[A][S][T][L|S][B|S][E|T:L][X|E][D|B:E]
nodes: 8
arcs: 7
undirected arcs: 0
directed arcs: 7
average markov blanket size: 2.25
average neighbourhood size: 1.75
average branching factor: 0.88
learning algorithm: Hill-Climbing
score: BIC (disc.)
penalization coefficient: 4.258597
tests used in the learning procedure: 77
optimized: TRUE
加载sna
包后,我会收到完全不同的东西:
library(sna)
#output
a
我得到:
Biased Net Model
Parameters:
Error in matrix(c(x$d, x$pi, x$sigma, x$rho), ncol = 1) :
'data' must be of a vector type, was 'NULL'
由于我并没有真正调用任何函数(只是想获取a
的输出),我认为使用::
运算符没有帮助。
我想知道问题是否是掩盖了我无法真正影响的内部功能。任何帮助都会很棒!
这有点类似于其他问答,只是在这种情况下有一个隐式调用print
,而不是显式函数调用。正是这个print
函数被屏蔽了。
要打印a
,您可以在终端中键入a
,也可以显式键入print(a)
。为了获得bn
对象的漂亮打印布局,作者编写了一个print
方法,这就是键入a
或print(a)
时调度的方法。(要在没有此特定打印的情况下查看它,您可以使用print.default(a)
)。注意到class(a) == "bn"
,您可以查找print
方法,方法是使用methods("print")
或键入bnlearn:::print
然后<tab>
查看可用函数:这会导致(非导出)函数bnlearn:::print.bn
。
长话短说,sna
包还有一个print.bn
方法,用于class
"bn"
的对象(偏置网络),正是这个函数掩盖了bnlearn
的对象。
因此,如果您在bnlearn
后加载sna
,您仍然可以通过显式使用bnlearn:::print.bn(a)
或重新定义print
方法print.bn <- bnlearn:::print.bn
来获得漂亮的打印,并且它应该按预期打印。