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ř3.3.1,1.0.1的igraph
- 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,但它變得更清晰。謝謝你的細節。 –