簡體   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