R:收集与列表中选定节点相邻的 igraph 节点

R: Collect igraph nodes adjacent to selected nodes in a list

将玩具图定义为:

> library(igraph)
> g = graph( c("John", "Jim",
               "Jim", "Jill", 
               "Jill", "John",
               "Jim", "Bob",
               "Bob", "Alice", 
               "Alice", "Jill"),
            directed=FALSE)

Select 2个节点随机为:

> select = V(g)[sample(1:5,2)]
> select
+ 2/5 vertices, named, from b165a23:
[1] John Jim

确定紧邻图表中上述 2 个选定节点的节点:

> adj = adjacent_vertices(g,select,mode="all")
> adj
$John
+ 2/5 vertices, named, from b165a23:
[1] Jim  Jill
$Jim
+ 3/5 vertices, named, from b165a23:
[1] John Jill Bob 

我得到的是一个列表 adj,它由 2 个列表组成:adj$Johnadj$Jim
我想要的是收集与John和Jim相邻的所有节点,即:
吉姆、吉尔、约翰、吉尔和鲍勃
然后将它们放在一个列表中。 Jill 是有意重复的,因为我实际上对计算边缘存根很感兴趣。

我确实尝试过各种方法,例如:

sel_list=adj$John
for  (ii = 2:(length(adj)) {
  sel_list = append(sel_list,adj[[ii]]) 
}

sel_list = c()
for  (ii = 1:(length(adj)) {
  sel_list = c(sel_list,adj[[ii]]) 
}

上面确实给了我一个顶点列表,但只捕获了列表的第一个组件 adj[[ii]]。对于大问题,我需要一种方法来收集所有相邻的顶点,而无需诉诸另一个昂贵的 for 循环来捕获 adj[[ii]] 的所有元素,例如丑陋的 hack:

sel_list = c()
for  (ii = 1:(length(adj)) {
  int_list=c()
  for (kk in 1:length(adj[[ii]]) {
    int_list=c(int_list,adj[[ii]][kk])
  }
  sel_list = c(sel_list,int_list) 
}

由于我不明白的原因,它没有像我预期的那样捕获 adj[[ii]] 中的所有节点。

选择一组其他节点的所有相邻节点并将它们放在一个简单列表中的最佳方法是什么?

你可以 unlist(adj) 并用它来索引 V(g) 我将重复问题中的一些代码并设置随机种子以使结果可重复,

set.seed(26)
select = V(g)[sample(1:5,2)]
select
+ 2/5 vertices, named, from e2f7066:
[1] John Jim 

adj = adjacent_vertices(g,select,mode="all")
N = unlist(adj)
V(g)[N]
+ 5/5 vertices, named, from e2f7066:
[1] Jim  Jill John Jill Bob