我想使用tidygraph获取两个节点之间最短路径的节点序列。考虑这个例子。
library(tidygraph)
library(tidyverse)
demo_netw <- tbl_graph(nodes = tibble(node_id = c("A", "B", "C", "D")),
edges = tribble(~from, ~to,
"B", "A",
"D", "C",
"A", "D"))
shortest_path_from_B_to_C <-
demo_netw %>%
convert(to_shortest_path, node_id == "B", node_id == "C")
shortest_path_from_B_to_C
## # A tbl_graph: 4 nodes and 3 edges
## #
## # A rooted tree
## #
## # Node Data: 4 x 2 (active)
## node_id .tidygraph_node_index
## <chr> <int>
## 1 A 1
## 2 B 2
## 3 C 3
## 4 D 4
## #
## # Edge Data: 3 x 3
## from to .tidygraph_edge_index
## <int> <int> <int>
## 1 2 1 1
## 2 4 3 2
## 3 1 4 3
输出显示节点A
、B
、C
和D
位于最短路径上,但未显示节点序列为B -> A -> D -> C
。返回的边缘数据也不显示边缘的顺序。
我知道我可以用 igraph 完成这样的任务。
library(igraph)
demo_igraph <-
demo_netw %>%
activate(edges) %>%
as_tibble() %>%
graph_from_data_frame()
# We cannot easily access the node_id column, so we must manually make the
# mapping "B" -> "2", "C" -> "3"
shortest_paths(demo_igraph, "2", "3")$vpath
## [[1]]
## + 4/4 vertices, named, from a854191:
## [1] 2 1 4 3
然而,由于几个原因,这是不优雅的。
- 我正在寻找一种不求助于其他软件包的 tidygraph 解决方案。
- 导出 tidygraph 边缘数据时,节点数据列
node_id
中包含的信息丢失了,所以我必须手动进行映射“B”->“2”,“C”->“3”,或者编写更精细的代码加入来自节点和边缘数据的信息。 - 我希望输出是
"B" "A" "D" "C"
,不是2 1 4 3
。
有没有一些直接的方法可以直接用tidygraph获取最短路径上的节点序列?