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