2017-01-02 73 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,但它变得更清晰。谢谢你的细节。 –