1

コールバック内で igraph ライブラリを使用して頂点属性の取得/設定を呼び出すと、R でセグメンテーション違反が発生することがわかりました。たとえば、コードのセグメントからの簡単なコールバック:

  dfsCallBack <- function(graph, data, extra) {
    cat("in:", paste(collapse=", ", data), "\n")
    distFromRoot <- data[2]
    vertexID <- data[1]
    set.vertex.attribute(graph, 0, name = 'color', value = 'blue')
    FALSE    
  }
  graph.dfs(g, 1, in.callback = dfsCallBack)

次のエラーが発生します。

  graph.dfs(g, 1, in.callback = dfsCallBack)
in: 0, 0 

 *** caught segfault ***
address 0x0, cause 'memory not mapped'

Traceback:
 1: .Call("R_igraph_dfs", graph, root, neimode, unreachable, as.logical(order),     as.logical(order.out), as.logical(father), as.logical(dist),     in.callback, out.callback, extra, rho, PACKAGE = "igraph")
 2: graph.dfs(g, 1, in.callback = dfsCallBack)

Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection: 

ここで何が問題なのですか?また、igraph はおそらくこれらのエラーの処理においてより堅牢である必要があり、R からのクラッシュは R のような高級言語にとって理想的ではありません。

4

1 に答える 1

1

いくつかのポイント。

  1. と言うとset.vertex.attribute(graph, ...)graph実際には変更されませんが、属性が更新された新しいコピーが返されます。R オブジェクトは (ほとんどの場合) 不変であり、変更することはできず、それらに基づいて新しいオブジェクトを作成するだけです。

  2. set.vertex.attribute(graph, 0, name = 'color', value = 'blue')頂点 ID は 1 から始まるため、0 は無効です。これはエラーとして報告される必要があり、開発ツリーで既に修正されています。

  3. これはエラーではなく、バグです。igraph エラーは R をクラッシュさせず、エラー メッセージを表示するだけです。igraph コードと R は同じスレッドで実行されるため、igraph のバグによって R がクラッシュする可能性があり、バグを回避する以外に、これについてできることはあまりありません。

igraph.dfsの結果を使用して属性を適切に設定することをお勧めします。もちろん、コールバックを使用して情報を記録したり、DFS を終了したりできます。

于 2013-07-16T20:18:43.217 に答える