我在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)
从第一个节点开始,我想返回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.
如果有人知道如何相应地修改我的功能。
答案 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