从根节点到达具有特定标签的所有下一个顶点

时间:2015-09-29 07:10:39

标签: r graph igraph

我在R stat中使用igraph。

我有一个顶点网络,它有两个标签:"红色"和"橙"。

我创建了一个"函数",它从根节点找到第一个" red"顶点。

此函数有效,但它使用全局变量而不是返回结果。它不是很优雅。我想改进我的功能,所以它返回一个节点列表,但我不知道该怎么做。

以下是代码:

library(igraph)

g <- make_tree(15, mode="undirected")
a <- as_adj_list(g)

V(g)$color <- "orange"
V(g)$color[c(3,5,8,9)] <- "red"

plot(g)

tree graph

从第一个节点开始,我想返回3,5,8,9但 13

功能:

mydfs <- function(a, s, nodes=NULL) {
  nodes <- c(s, nodes)

  for (child in a[[s]]) {
    if (!(child %in% nodes)) {

      v <- V(g)[child]

      if(v$color=="red") {
        okNodes <<- c(okNodes, as.numeric(v))
        return
      } else {
        mydfs(a, child, nodes)
      }
    }
  }
}

结果:

okNodes <- NULL # okNodes is a global variable which will stock the reached "red" vertices.
mydfs(a, 1) # mydfs([adjacency list], [root node])
okNodes 
# gives [1] 8 9 5 3. As you can see, the 13th node is not included as it follows the 3rd node which is red

您看到第13个节点未包含在内,这是我想要的功能的具体内容。

我喜欢不使用全局变量的函数。此外,我最好的将是相应的路径列表。

okNodes <- mydfs(a, 1) 
okNodes
# gives [1] 8 9 5 3.

如果有人知道如何相应地修改我的功能。

1 个答案:

答案 0 :(得分:0)

这非常难看,但它利用get.shortest.paths检查从指定节点到“红色”节点的所有路径。它将返回每个“红色”节点的完整路径。

findRed <- function(graph,node) {
  paths  <- get.shortest.paths(graph,node,V(graph)[V(graph)$color=="red"])$vpath
  colors <- lapply(paths, function(x) V(graph)$color[x] )
  unique(Map(function(p,c) as.vector(p[seq(1,match("red",c))]), paths, colors))
}

findRed(g,14)
#[[1]]
#[1] 14  7  3
#
findRed(g,1)
#[[1]]
#[1] 1 3
#
#[[2]]
#[1] 1 2 5
#
#[[3]]
#[1] 1 2 4 8
#
#[[4]]
#[1] 1 2 4 9