При генерации последовательности вершин с V
вызовы assign
и attr
сохраняют копию графа, который использовался для создания последовательности, вместе с самим объектом последовательности вершин.Таким образом, когда вы делаете что-то вроде V(g)$color = 'blue'
, последовательность вершин удобно оценивать в контексте этой копии g
.Это ясно, если вы проверяете один из методов, доступных для класса igraph.vs
.
> 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"