[英]R / igraph : getting vertex neighbors list within a depth-first-search callback causes a R to close. Any suggestion?
[英]R / igraph : any call to get/set vertex attribute within a depth-first-search callback causes a segfault
我发现在回调中使用igraph库对get / set vertex属性的任何调用都会导致R中出现段错误。例如,一段代码中的琐碎回调:
dfsCallBack <- function(graph, data, extra) {
cat("in:", paste(collapse=", ", data), "\n")
distFromRoot <- data[2]
vertexID <- data[1]
set.vertex.attribute(graph, 0, name = 'color', value = 'blue')
FALSE
}
graph.dfs(g, 1, in.callback = dfsCallBack)
产生此错误:
graph.dfs(g, 1, in.callback = dfsCallBack)
in: 0, 0
*** caught segfault ***
address 0x0, cause 'memory not mapped'
Traceback:
1: .Call("R_igraph_dfs", graph, root, neimode, unreachable, as.logical(order), as.logical(order.out), as.logical(father), as.logical(dist), in.callback, out.callback, extra, rho, PACKAGE = "igraph")
2: graph.dfs(g, 1, in.callback = dfsCallBack)
Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection:
怎么了 另外,igraph在处理这些错误时可能应该更健壮,因为R之类的崩溃对于R之类的高级语言而言并不理想。
有两点。
如果您说set.vertex.attribute(graph, ...)
,则实际上不会更改graph
,但是会返回具有更新属性的新副本。 R对象(几乎总是)是不可变的,您不能更改它们,只能基于它们创建新对象。
set.vertex.attribute(graph, 0, name = 'color', value = 'blue')
是错误的,因为顶点ID从1开始,所以0无效。 这应该报告为错误,并且已经在我们的开发树中修复。
这不是错误,而是错误。 igraph错误不会使R崩溃,它们只会给出错误消息。 由于igraph代码和R在同一线程中运行,igraph错误可能会使R崩溃,并且除了避免错误外,我们对此无能为力。
我建议使用igraph.dfs
的结果来igraph.dfs
地设置属性。 当然,您可以使用回调来记录信息或终止DFS。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.