2017-01-02 13 views
1

igraph::topological.sort()を使って、グラフのトポロジカルソートを取得し、グラフにサイクルがあるかどうかをチェックしようとしました。この関数は、グラフにサイクルが含まれているときに部分的な結果のみを警告して返しますが、グラフのサイクルが終了すると処理を停止する必要があります。tryCatch()igraph::topological.sort()を呼び出します。 その後、Rインタプリタはコアダンプされました。R igraphパッケージのtopological.sort()からの警告をキャッチするときのコアダンプ

最小限のコードを再現する:

library(igraph) 

# This has a cycle 
adjacency_with_cycle <- matrix(c(0,1,0,1,0,0,0,1,0), 3, 3) 
g_with_cycle <- graph_from_adjacency_matrix(adjacency_with_cycle) 


# This doesn't 
adjacency_without_cycle <- matrix(c(0,1,0,0,0,0,0,1,0), 3, 3) 
g_without_cycle <- graph_from_adjacency_matrix(adjacency_without_cycle) 

# Codes below moves 
## Only warns on the graph with cycle. 

topological.sort(g_with_cycle) 
## No problem on the acyclic graph. 

topological.sort(g_without_cycle) 

## Call in tryCatch. but no warning 
tryCatch({ 
    topological.sort(g_without_cycle) 
    }, 
    warning = function (w) stop()) 

# Just a tryCatch 
tryCatch({warning("warn")}, warning = function (w) stop("stop")) 


# Core dumped when catching warning 
tryCatch({ 
    topological.sort(g_with_cycle) 
    }, 
    warning = function (w) stop()) My environments are: 

私の環境は、(問題の両方で発生する)

  • Windwos 10、MRO R 3.3.1、IGRAPH 1.0.1
  • ManjaroのLinux 、R 3.3.2、igraph 1.0.1

上記のように、私は知りたい

  • これはigraphパッケージの問題ですか、それとも別ですか?
  • これはなぜ発生するのですか? tryCatch()は警告をキャッチしていますか?
  • 答えて

    1

    options(warn=2)を使用してエラーにする場合は、アボートとコアダンプも発生します。それはigraphの問題です。それをigraphの管理者に報告してください。

    +0

    ありがとうございます。私はそれを保守者に報告します。私はまだ、一般的に、どのように、なぜ、どのように警告を受けてセグメンテーションフォールトが起こるのか、あるいはRインタプリタが管理できないものが不思議です。 –

    +1

    Rは誤った動作をするユーザCコードについては何もできません。 Linux上で 'gdb'を実行し、' topological.sort'のRコードを見ると、この場合、 'on.exit'式から呼び出された' R_igraph_finalizer' C関数が、悪いポインタで 'free'を呼び出すことがわかります。 'tryCatch'でエラーをキャッチするか、警告を' options(warn = 2) 'でエラーにすると 'on.exit'コードが実行されます。 igraphは、そのようなジャンプが発生しても 'R_igraph_finalizer'が安全に実行できることを確認する必要があります。 igraphメンテナに今すぐ渡してください。 –

    +0

    私の理解によれば、 'tryCath()'や 'options(warn = 2)'の中で呼び出されたC実装部分が実行される前にRはシグナルハンドラを設定していますか?したがって、シグナルハンドラが何か間違っているとRはそれとは何の関係もありません。私はRがCと何をするのか分かっていませんが、それはより明確になりました。詳細をありがとう。 –

    関連する問題