繁体   English   中英

R / igraph:在深度优先搜索回调中对获取/设置顶点属性的任何调用都会导致段错误

[英]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之类的高级语言而言并不理想。

有两点。

  1. 如果您说set.vertex.attribute(graph, ...) ,则实际上不会更改graph ,但是会返回具有更新属性的新副本。 R对象(几乎总是)是不可变的,您不能更改它们,只能基于它们创建新对象。

  2. set.vertex.attribute(graph, 0, name = 'color', value = 'blue')是错误的,因为顶点ID从1开始,所以0无效。 这应该报告为错误,并且已经在我们的开发树中修复。

  3. 这不是错误,而是错误。 igraph错误不会使R崩溃,它们只会给出错误消息。 由于igraph代码和R在同一线程中运行,igraph错误可能会使R崩溃,并且除了避免错误外,我们对此无能为力。

我建议使用igraph.dfs的结果来igraph.dfs地设置属性。 当然,您可以使用回调来记录信息或终止DFS。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM