1

我发现在回调中使用 igraph 库对获取/设置顶点属性的任何调用都会导致 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 这样的高级语言来说并不理想。

4

1 回答 1

1

几点。

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

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

  3. 这不是错误,这是错误。igraph 错误不会使 R 崩溃,它们只是给出错误消息。因为 igraph 代码和 R 在同一个线程中运行,igraph 的 bug 可能会导致 R 崩溃,除了避免 bug 之外,我们对此无能为力。

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

于 2013-07-16T20:18:43.217 回答