[Top][All Lists]
[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