OK, for the records, I created a bug report here:
https://github.com/igraph/igraph/issues/502

Gabor


On Tue, Jun 25, 2013 at 10:26 AM, Gábor Csárdi <[email protected]>wrote:

> Hi Florian,
>
> I agree this is confusing.
>
> The idea is that edges and vertices do not exist in isolation, but they
> are always part of a graph. E() and V() return objects that reference the
> graph they were created from. It is not expected that these objects will
> work with other graphs, though. The problem is that igraph does not always
> detect when you are trying to use them with other graphs.
>
> The get.edges(), neighbors(), etc. functions return plain R vectors/lists,
> these do not reference the original graph.
>
> So the rule of thumb is that you should only use the result of E() and G()
> with the graph you created them from.
>
> Btw. I think it would make sense to create a bug report from your email,
> and then we can discuss things there if you are interested. You can create
> a bug report here: https://github.com/igraph/igraph/issues/new Or I can
> also create one, if you don't want to.
>
> Best,
> Gabor
>
>
> On Tue, Jun 25, 2013 at 5:29 AM, Florian Klinglmueller 
> <[email protected]>wrote:
>
>> Hi,
>>
>> I have been playing around with igraph lately and think that it is a
>> great package as it adds tremendous functionality to R. However, I
>> continually get into trouble with basic edge and vertex operations,
>> especially, adding and removing edges. I have added some examples of
>> confusion at the end of this mail and attached the code.
>>
>> I think that there is a certain lack of consistency in how they operate,
>> to the degree that I would consider it a bug. Maybe I'm just wrong in
>> expecting that the examples given below should work in some consistent way.
>> However, it makes it extremely difficult to decide whether a certain way
>> to operate on some elements of a graph (e.g. get all edges via E(G) or
>> get.edges(G,...)) will work for a certain problem or not (e.g. add them to
>> a graph via + or add.edges, ...) when writing code. A major problem that I
>> see is that it is essentially unclear how to write iterators over the nodes
>> or edges of an igraph object (without resorting to exporting to other
>> classes (eg via get.edgelist)).
>>
>> Best,
>> Florian
>>
>>
>> R 2.15.1> require(igraph)
>> Loading required package: igraph
>> R 2.15.1> # Consider the following graphs
>> R 2.15.1>
>> R 2.15.1> G4 <- graph.full(4)
>> R 2.15.1> G <-  minimum.spanning.tree(G4)
>> R 2.15.1> g <-  G4 - G
>> R 2.15.1>
>> R 2.15.1> G[]
>> Loading required package: Matrix
>> Loading required package: lattice
>> 4 x 4 sparse Matrix of class "dgCMatrix"
>>
>> [1,] . 1 1 1
>> [2,] 1 . . .
>> [3,] 1 . . .
>> [4,] 1 . . .
>> R 2.15.1> g[]
>> 4 x 4 sparse Matrix of class "dgCMatrix"
>>
>>
>>> [1,] . . . .
>>>
>> [2,] . . 1 1
>> [3,] . 1 . 1
>> [4,] . 1 1 .
>> R 2.15.1>
>> R 2.15.1> # now here comes what confuses me
>> R 2.15.1>
>> R 2.15.1> for(e in E(G))
>> +   print(delete.edges(G,e)[])
>> 4 x 4 sparse Matrix of class "dgCMatrix"
>>
>> [1,] . . 1 1
>> [2,] . . . .
>> [3,] 1 . . .
>> [4,] 1 . . .
>> 4 x 4 sparse Matrix of class "dgCMatrix"
>>
>> [1,] . 1 . 1
>> [2,] 1 . . .
>> [3,] . . . .
>> [4,] 1 . . .
>> 4 x 4 sparse Matrix of class "dgCMatrix"
>>
>> [1,] . 1 1 .
>> [2,] 1 . . .
>> [3,] 1 . . .
>> [4,] . . . .
>> R 2.15.1>
>> R 2.15.1> # works
>> R 2.15.1>
>> R 2.15.1> for(e in E(G))
>> +   print(add.edges(g,e)[])
>> Error in print(add.edges(g, e)[]) :
>>   error in evaluating the argument 'x' in selecting a method for function
>> 'print': Error in add.edges(g, e) :
>>   At type_indexededgelist.c:269 : invalid (odd) length of edges vector,
>> Invalid edge vector
>> R 2.15.1>
>> R 2.15.1> # gives an error
>> R 2.15.1>
>> R 2.15.1> # next
>> R 2.15.1> e <- E(G)[1]
>> R 2.15.1> E <- get.edge(G,1)
>> R 2.15.1>
>> R 2.15.1> delete.edges(G,e)[]
>> 4 x 4 sparse Matrix of class "dgCMatrix"
>>
>> [1,] . . 1 1
>> [2,] . . . .
>> [3,] 1 . . .
>> [4,] 1 . . .
>> R 2.15.1> # removes one edge
>> R 2.15.1>
>> R 2.15.1> delete.edges(G,E)[]
>> 4 x 4 sparse Matrix of class "dgCMatrix"
>>
>> [1,] . . . 1
>> [2,] . . . .
>> [3,] . . . .
>> [4,] 1 . . .
>> R 2.15.1> # removes two edges
>> R 2.15.1>
>> R 2.15.1> (G - e)[]
>> 4 x 4 sparse Matrix of class "dgCMatrix"
>>
>> [1,] . . 1 1
>> [2,] . . . .
>> [3,] 1 . . .
>> [4,] 1 . . .
>> R 2.15.1> # works
>> R 2.15.1>
>> R 2.15.1> (G - E)[]
>> 2 x 2 sparse Matrix of class "dgCMatrix"
>>
>> [1,] . .
>> [2,] . .
>> R 2.15.1> # empty graph with 2 nodes
>> R 2.15.1>
>> R 2.15.1> add.edges(g,e)
>> Error in add.edges(g, e) :
>>   At type_indexededgelist.c:269 : invalid (odd) length of edges vector,
>> Invalid edge vector
>> R 2.15.1> # error messag
>> R 2.15.1>
>> R 2.15.1> add.edges(g,E)[]
>> 4 x 4 sparse Matrix of class "dgCMatrix"
>>
>> [1,] . 1 . .
>> [2,] 1 . 1 1
>> [3,] . 1 . 1
>> [4,] . 1 1 .
>> R 2.15.1> # works
>> R 2.15.1>
>> R 2.15.1> g + E
>> Error in `+.igraph`(g, E) : Cannot add unknown type to igraph graph
>> R 2.15.1> # error
>> R 2.15.1>
>> R 2.15.1> (g + e)[]
>> 5 x 5 sparse Matrix of class "dgCMatrix"
>>
>> [1,] . . . . .
>> [2,] . . 1 1 .
>> [3,] . 1 . 1 .
>> [4,] . 1 1 . .
>> [5,] . . . . .
>> R 2.15.1> # adds a node ???
>> R 2.15.1>
>>
>> _______________________________________________
>> igraph-help mailing list
>> [email protected]
>> https://lists.nongnu.org/mailman/listinfo/igraph-help
>>
>>
>
_______________________________________________
igraph-help mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/igraph-help

Reply via email to