2013-11-15 1 views
12

Я использую пакет igraph в R.Как перечислить все атрибуты вершины графа в R?

Я хотел бы связать некоторые данные с каждой вершиной, например. путем добавления атрибутов id и описания к каждому. Атрибуты определяются во время выполнения. У меня есть несколько связанных вопросов о том, как установить и получить эти данные.

Чтобы установить идентификатор некоторой вершины, я использовать (где g является график):

> set.vertex.attribute(g,'id',1,'first_id') # etc 

я ожидал, чтобы быть в состоянии прочитать атрибуты обратно с:

> get.vertex.attribute(g,'id',1) 

Но это возвращает NULL. Я делаю что-то неправильно?

Кроме того, функция с вызовом get.vertex.attribute не имеет доступа к списку имен атрибутов. Как я могу извлечь имена атрибутов из графика g?

Наконец, я хочу установить/получить значения атрибутов из/в именованный список. Есть ли простой способ сделать это, не зацикливая каждую вершину и атрибут и применяя set. - или get.vertex.attribute?

спасибо!

+0

Был тот же опыт. Спасибо за публикацию. –

ответ

13

Похоже, вы должны присвоить результаты set.vertex.attribute обратно g так:

g <- graph.data.frame(data.frame(one=1:2,two=2:3)) 
g <- set.vertex.attribute(g,'id',1,'first_id') 
get.vertex.attribute(g,'id',1) 
#[1] "first_id" 

В помощь при ?get.vertex.attribute говорит:

график: Объект графа работать. Обратите внимание, что исходный граф никогда не был изменен, вместо этого возвращается новый объект графа; если вы не назначаете его переменной, то ваши модификации будут потеряны! См. Примеры ниже.

Кроме того, из того же файла справки есть ...

list.graph.attributes, list.vertex.attributes и list.edge.attributes возвращают вектор символов, имена присутствующие атрибуты.

list.vertex.attributes(g) 
#[1] "name" "id" 

С быстрым взглядом там, кажется, не быть простой функции для записи в/из вершин атрибутов скопом. Вы можете придумать что-то вроде этого, хотя:

lapply(list.vertex.attributes(g),function(x) get.vertex.attribute(g,x)) 
#[[1]] 
#[1] "1" "2" "3" 
# 
#[[2]] 
#[1] "first_id" NA   NA 
+0

Фантастический - спасибо! –

+0

Это должна быть новая функция, но следующая команда очень удобна для извлечения всех данных атрибутов вершин: get.data.frame() –

7

Используйте следующий синтаксис для назначения атрибутов вершин на месте:

> V(g)[1]$id <- "first_id" 
> V(g)[1]$id 
[1] "aaa" 

Этот синтаксис также позволяет получить или установить атрибут вершины для всех вершин ; просто опустите индексирование:

> V(g)$id <- c("aa", "bb", "cc") 
+0

Вот что мне нужно - спасибо. –

+0

Это хорошо работает, но вы можете мне помочь в этом: у меня есть только имя атрибута в переменной, например. idName = "id". Хотя 'V (g) $ id' работает хорошо,' V (g) [[idName]] 'дает мне ошибку' Ошибка в V (g) [[idName]]: индекс за пределами '. Как мне ссылаться на него с помощью idName? Благодаря! –

+0

Я не специалист в R, поэтому я не знаю, есть ли какой-нибудь более простой способ, но после некоторых экспериментов я нашел, что это работает: 'eval (parse (text = paste (" V (g) $ ", varname , sep = ""))) '. Это в основном создает строку, содержащую выражение для оценки, анализирует его, а затем вызывает 'eval' для оценки выражения. –