igraph-help
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[igraph] Re: the R "igraph" library - converting graphs from graphNEL to


From: Gábor Csárdi
Subject: [igraph] Re: the R "igraph" library - converting graphs from graphNEL to igraph format
Date: Sun, 7 Feb 2010 20:18:19 +0100

Avril,

you are right. That function is for the 0.6 version of igraph and that
version has a slightly different graph.adjlist function.

Your correction always creates a directed graph, however. You need
something like

g <- graph.adjlist(al, directed= edgemode(graphNEL)=="directed",
duplicated=TRUE)

Best,
Gabor

On Sat, Feb 6, 2010 at 7:28 PM, Coghlan, Avril <address@hidden> wrote:
> Dear Gabor,
>
> Thank you for your very helpful reply.
>
> That is great that there are already functions to convert between graphNEL 
> and igraph format graphs.
> I'm just a beginner at R, so am sure the functions that the igraph developers 
> have written are much better than I could write.
>
> However, I think I might have found one small problem with the 
> igraph.from.graphNEL function that is at:
> http://bazaar.launchpad.net/~igraph/igraph/0.6-main/annotate/head:/interfaces/R/igraph/R/conversion.R
>
> I find that in order to make it work for directed graphs, I need to change 
> the line:
>    g <- graph.adjlist(al, mode=mode, duplicate=TRUE)
> to be:
>    g <- graph.adjlist(al, directed=TRUE, duplicate=TRUE)
> I think this is because the graph.adjlist() function takes the argument 
> "directed" rather than argument "mode".
> Is this correct?
>
> For example, if I type:
>> library("graph")
>> library("igraph")
>> V <- LETTERS[1:4] # Make a graphNEL graph
>> edL <- vector("list", length=4)
>> names(edL) <- V
>> for(i in 1:4)
>      edL[[i]] <- list(edges=5-i, weights=runif(1))
>> gR <- new("graphNEL", nodes=V, edgeL=edL)
>> igraph.from.graphNEL(gR)
> I get the error message:
>   Error in graph.adjlist(al, mode = mode, duplicate = TRUE) :
>       unused argument(s) (mode = mode)
>
> This error message goes away if I change the line in function 
> igraph.to.graphNEL() as described above.
> I'm not sure if this is a bug, but thought I'd tell you just in case.
>
> thanks for your help, I appreciate it a lot.
> Avril
>
> Avril Coghlan
> University College Cork, Ireland
>
> -----Original Message-----
> From: address@hidden [mailto:address@hidden On Behalf Of Gábor Csárdi
> Sent: 19 January 2010 19:46
> To: Coghlan, Avril
> Subject: Re: the R "igraph" library
>
> Dear Avril,
>
> thanks for your efforts! Actually we happen to have such functions in
> the development version of igraph. You can see the development version
> here:
> https://code.launchpad.net/~igraph/igraph/0.6-main
> or you can get a nightly build from it here:
> http://code.google.com/p/igraph/downloads/list
>
> You can see the conversion functions here:
> http://bazaar.launchpad.net/~igraph/igraph/0.6-main/annotate/head:/interfaces/R/igraph/R/conversion.R
> They are called igraph.from.graphNEL and igraph.to.graphNEL
>
> If you think your version is better in some respect, then please tell us!
>
> Best Regards,
> Gabor
>
> On Tue, Jan 19, 2010 at 4:02 PM, Coghlan, Avril <address@hidden> wrote:
>> Dear Dr Csardi,
>>
>>
>>
>> I have been using the R "igraph" library and finding it very useful.
>>
>>
>>
>> I have written a function for converting a graph that is in the graphNEL
>> object format used by the R "graph" library, into the graph object format
>> used by the igraph library (see below). As input it takes a graph in the
>> graphNEL format used by the "graph" library, and as output it returns a
>> graph in the format used by the "igraph" library.
>>
>>
>>
>> This function is useful to me, as I like to use functions in both the graph
>> and igraph libraries.
>>
>>
>>
>> I am wondering would you consider including this function in the "igraph"
>> library, as it might also be useful to others?
>>
>>
>>
>> Regards,
>>
>> Avril Coghlan
>>
>> University College Cork, Ireland
>>
>>
>>
>> # Function to convert a graphNEL graph object to a graph object for the
>> igraph library
>>
>> makeigraphgraph <- function(mygraph)
>>
>> {
>>
>>    # Find the number of nodes in the input graph
>>
>>    nodes <- nodes(mygraph)
>>
>>    numnodes <- length(nodes)
>>
>>
>>
>>    # Record the vertex number for each vertex name
>>
>>    myvector <- vector()
>>
>>    for (i in 1:numnodes)
>>
>>    {
>>
>>       node <- nodes[i] # "node" is the vertex name, i is the vertex number
>>
>>       myvector[`node`] <- i  # Add named element to myvector
>>
>>    }
>>
>>
>>
>>    # Create a graph in the "igraph" library format, with numnodes nodes:
>>
>>    newgraph <- graph.empty(n=numnodes,directed=FALSE)
>>
>>    # First record which edges we have seen already in the "mymatrix" matrix,
>>
>>    # so that we don't add any edge twice:
>>
>>    mymatrix <- matrix(nrow=numnodes,ncol=numnodes)
>>
>>    for (i in 1:numnodes)
>>
>>    {
>>
>>       for (j in 1:numnodes)
>>
>>       {
>>
>>          mymatrix[i,j] = 0
>>
>>          mymatrix[j,i] = 0
>>
>>       }
>>
>>    }
>>
>>    # Now add edges to the graph "newgraph":
>>
>>    for (i in 1:numnodes)
>>
>>    {
>>
>>       node <- nodes[i] # "node" is the vertex name, i is the vertex number
>>
>>       # Find the nodes that this node is joined to:
>>
>>       neighbours <- adj(mygraph, node)
>>
>>       neighbours <- neighbours[[1]] # Get the list of neighbours
>>
>>       numneighbours <- length(neighbours)
>>
>>       if (numneighbours >= 1) # If this node "node" has some edges to other
>> nodes
>>
>>       {
>>
>>          for (j in 1:numneighbours)
>>
>>          {
>>
>>             neighbour <- neighbours[j]
>>
>>             # Get the vertex number
>>
>>             neighbourindex <- myvector[neighbour]
>>
>>             # Add a node in the new graph "newgraph" between vertices (i-1)
>> and (neighbourindex-1)
>>
>>             # In graph "newgraph", the vertices are counted from 0 upwards.
>>
>>             indexi <- i
>>
>>             indexj <- neighbourindex
>>
>>             # If we have not seen this edge already:
>>
>>             if (mymatrix[indexi,indexj] == 0 && mymatrix[indexj,indexi] ==
>> 0)
>>
>>             {
>>
>>                mymatrix[indexi,indexj] <- 1
>>
>>                mymatrix[indexj,indexi] <- 1
>>
>>                # Add edges to the graph "newgraph"
>>
>>                newgraph <- add.edges(newgraph, c(i-1, neighbourindex-1))
>>
>>             }
>>
>>          }
>>
>>       }
>>
>>    }
>>
>>    # Set the names of the vertices in graph "newgraph":
>>
>>    newgraph <- set.vertex.attribute(newgraph, "name", value=nodes)
>>
>>
>>
>>    return(newgraph)
>>
>> }
>>
>>
>
>
>
> --
> Gabor Csardi <address@hidden>     UNIL DGM
>



-- 
Gabor Csardi <address@hidden>     UNIL DGM




reply via email to

[Prev in Thread] Current Thread [Next in Thread]