gpt4 book ai didi

r - 使用 R 的 igraph 中的迭代器 V 和 E 如何工作?

转载 作者:行者123 更新时间:2023-12-04 21:49:40 24 4
gpt4 key购买 nike

我查看了 V 和 E 的源代码,但我不确定它们是如何工作的。
这是V的代码:

> V
function (graph)
{
if (!is.igraph(graph)) {
stop("Not a graph object")
}
vc <- vcount(graph)
if (vc == 0) {
res <- numeric()
}
else {
res <- 0:(vc - 1)
}
class(res) <- "igraph.vs"
ne <- new.env()
assign("graph", graph, envir = ne)
attr(res, "env") <- ne
res
}

我不确定调用 assign 和 attr 的目的是什么。
分配图表是否会创建图表的新副本?这是多么有效/低效?也就是说,这会生成多少个图形副本,例如:
V(g)$someattr <- somevector

谢谢您的帮助。

最佳答案

使用 V 生成顶点序列时,对 assign 的调用和 attr存储用于创建序列的图的副本以及顶点序列对象本身。这样当你做类似 V(g)$color = 'blue' 的事情时,顶点序列可以在 g 的这个副本的上下文中方便地评估.如果您检查可用于 igraph.vs 的方法之一,这一点就很清楚了。类(class)。

> methods(class='igraph.vs')
[1] [.igraph.vs [<-.igraph.vs $.igraph.vs $<-.igraph.vs print.igraph.vs

> `$.igraph.vs`
function (x, name)
{
get.vertex.attribute(get("graph", attr(x, "env")), name,
x)
}
<environment: namespace:igraph>

这里很明显 $索引操作将在用于创建顶点序列的图形环境的上下文中进行评估。

您提出了一个很好的观点,尽管这确实会创建图形的多个副本(这可能会被垃圾收集,但仍然需要注意这一点)。如果您修改图形的属性 g,这很容易证明。 ,在你已经创建了一个顶点序列后 vs = V(g) .属性在 g 中更新,但不在 g 的副本中存储在附加到 vs 的环境中.
> g = graph(c(0:1), directed=F)
> g = set.vertex.attribute(g, 'color', value='blue')
> vs = V(g)
> vs$color
[1] "blue" "blue"
> g = set.vertex.attribute(g, 'color', value='red')
> V(g)$color
[1] "red" "red"
> vs$color
[1] "blue" "blue"

关于r - 使用 R 的 igraph 中的迭代器 V 和 E 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7197498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com