跳到内容

as_directed() 将无向图转换为有向图,as_undirected() 则相反,它将有向图转换为无向图。

用法

as_directed(graph, mode = c("mutual", "arbitrary", "random", "acyclic"))

as_undirected(
  graph,
  mode = c("collapse", "each", "mutual"),
  edge.attr.comb = igraph_opt("edge.attr.comb")
)

参数

graph

要转换的图。

mode

字符常量,定义转换算法。 对于 as_directed(),它可以是 mutualarbitrary。 对于 as_undirected(),它可以是 eachcollapsemutual。 请参见下面的详细信息。

edge.attr.comb

指定如何处理边属性,如果 mode="collapse"mode="mutual"。 在这些情况下,许多边可能会映射到新图中的一个边,并且它们的属性会被组合。 请参阅 attribute.combination() 获取有关此内容的详细信息。

一个新的图对象。

详细信息

as_directed() 的转换算法

"arbitrary"

图中的边数保持不变,为每个无向边创建一个任意方向的有向边,但边的方向是确定性的(即,如果您多次调用该函数,它总是指向相同的方向)。

"mutual"

为每个无向边创建两个有向边,每个方向一个。

"random"

图中的边数保持不变,并且为每个无向边创建一个随机方向的有向边。 如果您使用相同的图多次调用该函数,您将获得不同的结果。

"acyclic"

图中的边数保持不变,并且为每个无向边创建一个有向边,以确保生成的图是无环的。 这是通过确保边始终从较低索引的顶点指向较高索引的顶点来实现的。 请注意,如果原始图包含环边,则该图可能包含长度为 1 的循环。

as_undirected() 的转换算法

"each"

边数保持不变,为每个有向边创建一个无向边,此版本可能会创建具有多条边的图。

"collapse"

对于每对至少通过一条有向边连接的顶点,将创建一个无向边,不会创建多条边。

"mutual"

将为每对互边创建一个无向边。 非互边将被忽略。 如果同一对顶点之间存在多个互边对,则此模式可能会创建多条边。

作者

Gabor Csardi csardi.gabor@gmail.com

to_directed().

示例


g <- make_ring(10)
as_directed(g, "mutual")
#> IGRAPH cd8f02f D--- 10 20 -- Ring graph
#> + attr: name (g/c), mutual (g/l), circular (g/l)
#> + edges from cd8f02f:
#>  [1]  1-> 2  2-> 3  3-> 4  4-> 5  5-> 6  6-> 7  7-> 8  8-> 9  9->10  1->10
#> [11]  2-> 1  3-> 2  4-> 3  5-> 4  6-> 5  7-> 6  8-> 7  9-> 8 10-> 9 10-> 1
g2 <- make_star(10)
as_undirected(g)
#> IGRAPH 8c817a3 U--- 10 10 -- Ring graph
#> + attr: name (g/c), mutual (g/l), circular (g/l)
#> + edges from 8c817a3:
#>  [1] 1-- 2 2-- 3 3-- 4 4-- 5 5-- 6 6-- 7 7-- 8 8-- 9 9--10 1--10

# Combining edge attributes
g3 <- make_ring(10, directed = TRUE, mutual = TRUE)
E(g3)$weight <- seq_len(ecount(g3))
ug3 <- as_undirected(g3)
print(ug3, e = TRUE)
#> IGRAPH b0fbdfa U-W- 10 10 -- Ring graph
#> + attr: name (g/c), mutual (g/l), circular (g/l), weight (e/n)
#> + edges from b0fbdfa:
#>  [1] 1-- 2 2-- 3 3-- 4 4-- 5 5-- 6 6-- 7 7-- 8 8-- 9 1--10 9--10
if (FALSE) { # rlang::is_interactive()
x11(width = 10, height = 5)
layout(rbind(1:2))
plot(g3, layout = layout_in_circle, edge.label = E(g3)$weight)
plot(ug3, layout = layout_in_circle, edge.label = E(ug3)$weight)
}

g4 <- make_graph(c(
  1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 4,
  6, 7, 7, 6, 7, 8, 7, 8, 8, 7, 8, 9, 8, 9,
  9, 8, 9, 8, 9, 9, 10, 10, 10, 10
))
E(g4)$weight <- seq_len(ecount(g4))
ug4 <- as_undirected(g4,
  mode = "mutual",
  edge.attr.comb = list(weight = length)
)
print(ug4, e = TRUE)
#> IGRAPH d0b3c25 U-W- 10 7 -- 
#> + attr: weight (e/n)
#> + edges from d0b3c25:
#> [1]  6-- 7  7-- 8  8-- 9  8-- 9  9-- 9 10--10 10--10