Ошибка с подграфом в пакете igraph

Я хочу получить подграф всех циклов в графе. Я попробовал код ниже

 for (i in 1:length(cycles)){
    vids<-as.numeric(unlist(cycles[[i]]))
    subgraph<- induced.subgraph(graph, vids)
 }

Но он выдает и ошибка, как показано ниже:

Error in .Call("R_igraph_induced_subgraph", graph, vids - 1, impl, PACKAGE = "igraph") : 
  At iterators.c:759 : Cannot create iterator, invalid vertex id, Invalid vertex id

Я обнаружил, что код работает со вторым элементом в списке cycles, который короче, но не с первым. Так что, если я попробую, это сработает,

subgraph<- induced.subgraph(g, c(3,4))

но нет

subgraph<- induced.subgraph(g, c(26, 2, 30, 29, 25, 9, 27, 13, 14, 8, 23, 20, 19, 17, 12, 11, 24, 21, 6, 28, 15,3,4))

Также приветствуются любые предложения по замене цикла for.

Воспроизводимый пример:

    library(igraph)
    graph<-graph(c(1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,
           16,17,17,18,18,19,19,20,20,21,21,1,22,23,23,22),directed=T)
    V(graph)$name<-c(26, 2, 30, 29, 25, 9, 27, 13, 14, 8, 23, 20, 19, 17, 12, 11, 
             24, 21, 6, 28, 15,3,4)

    cycles<-list(list(26L, 2L, 30L, 29L, 25L, 9L, 27L, 13L, 14L, 8L, 23L, 
        20L, 19L, 17L, 12L, 11L, 24L, 21L, 6L, 28L, 15L), list(4L, 
        3L))

person qshng    schedule 12.05.2015    source источник


Ответы (1)


Если вы передадите номер в качестве идентификатора вершины функции induced.subgraph, она будет обращаться к вершинам по номеру (на вашем графике номера от 1 до 23), что приведет к ошибке «Недопустимый идентификатор вершины» из-за таких индексов, как 26, 29 и 30. Вы хотите на самом деле обращаться к вершинам по имени, что вы можете сделать, передав строку вместо числа:

for (i in 1:length(cycles)){
  vids <- as.character(unlist(cycles[[i]]))
  subgraph<- induced.subgraph(graph, vids)
  plot(subgraph)
}

Теперь вы успешно извлекли два подграфа:

введите здесь описание изображения

введите сюда код

Невозможно избежать зацикливания вашего списка для создания подграфов, хотя вы можете скрыть цикл с помощью чего-то вроде функции lapply:

subgraphs <- lapply(cycles, function(x) induced.subgraph(graph, as.character(unlist(x))))

Теперь subgraphs — это список графиков, по одному на каждый цикл. В вашем случае к ним можно получить доступ с помощью subgraphs[[1]] и subgraphs[[2]].

person josliber♦    schedule 12.05.2015