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()
は警告をキャッチしていますか?
ありがとうございます。私はそれを保守者に報告します。私はまだ、一般的に、どのように、なぜ、どのように警告を受けてセグメンテーションフォールトが起こるのか、あるいはRインタプリタが管理できないものが不思議です。 –
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メンテナに今すぐ渡してください。 –
私の理解によれば、 'tryCath()'や 'options(warn = 2)'の中で呼び出されたC実装部分が実行される前にRはシグナルハンドラを設定していますか?したがって、シグナルハンドラが何か間違っているとRはそれとは何の関係もありません。私はRがCと何をするのか分かっていませんが、それはより明確になりました。詳細をありがとう。 –