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