R маскирующий конфликт: пакеты bnlearn и sna - PullRequest
0 голосов
/ 16 мая 2018

У меня проблемы с параллельным использованием пакетов 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), я не думаю, что с помощью оператора ::может помочь.

Интересно, проблема в маскировке внутренней функции, на которую я не могу реально повлиять.Любая помощь будет отличной!

1 Ответ

0 голосов
/ 16 мая 2018

Это несколько похоже на другие вопросы и ответы , за исключением того, что в этом случае есть неявный вызов 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.

Поэтому, если вы загрузите sna после bnlearn, вы все равно сможете получить красивую печать, явно указав bnlearn:::print.bn(a), или переопределив метод print print.bn <- bnlearn:::print.bn, и этодолжен печатать как положено.

...