Search code examples
rigraph

Run all_simple_paths() for more than one names in from argument


I have the nodes and edges datasets below and I would like to know if I could run the simple path function for more than one names at once instead of one at a time.

name<-c("Robert Zero",       "Amy Adams",         "Barry Beane",       "Henry Handler",     "Julie Jones",      
           "Charlie Cheese",    "Karen Klein",       "Lolly Landswright", "Imogene Isler",     "David Dufresne",   
           "Frank Flaherty",    "Egbert English",    "George Graham",     "Molly McKee",       "Norman Needle",    
           "Oscar Oliver",      "Peter Platteville", "Quincy Quebec",     "Roger Rabbit",      "Steve Sweet",      
           "Tom Thompson",      "Victor Valentino",  "Ulrich Uxbridge" )
    label<-c("Robert Zero",       "Amy Adams",         "Barry Beane",       "Henry Handler",     "Julie Jones",      
             "Charlie Cheese",    "Karen Klein",       "Lolly Landswright", "Imogene Isler",     "David Dufresne",   
             "Frank Flaherty",    "Egbert English",    "George Graham",     "Molly McKee",       "Norman Needle",    
             "Oscar Oliver",      "Peter Platteville", "Quincy Quebec",     "Roger Rabbit",      "Steve Sweet",      
             "Tom Thompson",      "Victor Valentino",  "Ulrich Uxbridge" )
    nodes<-data.frame(name,label)
    
    
    from<-c("Robert Zero",       "Amy Adams",         "Barry Beane",       "Barry Beane",       "Barry Beane",      
             "Julie Jones",       "Karen Klein",       "Imogene Isler",     "David Dufresne",    "Frank Flaherty",   
             "Egbert English",    "George Graham",     "Molly McKee",       "Molly McKee",       "Amy Adams",        
             "Peter Platteville", "Amy Adams",         "Roger Rabbit",      "Julie Jones",       "Robert Zero",      
             "Steve Sweet",       "Tom Thompson",      "Steve Sweet",       "Ulrich Uxbridge",   "Henry Handler",    
             "Barry Beane",       "Barry Beane",       "Charlie Cheese",    "Barry Beane",       "Victor Valentino", 
             "Tom Thompson"     )
    to<-c( "Amy Adams",         "Barry Beane",       "Henry Handler",     "Julie Jones",       "Charlie Cheese",   
           "Karen Klein",       "Lolly Landswright", "Robert Zero",       "Frank Flaherty",    "Robert Zero",      
           "George Graham",     "Robert Zero",       "Norman Needle",     "Julie Jones",       "Oscar Oliver",     
           "Robert Zero",       "Quincy Quebec",     "Robert Zero",       "Molly McKee",       "Steve Sweet",      
           "Tom Thompson",      "Victor Valentino",  "Ulrich Uxbridge",   "Barry Beane",       "Robert Zero",      
           "Imogene Isler",     "Peter Platteville", "Robert Zero",       "Roger Rabbit",      "Robert Zero",      
           "Roger Rabbit"   )
    
    edges<-data.frame(from,to)
    
    
    #Combine them in order to create the graph object
    library(igraph)
    library(dplyr)
    
    gph <- graph_from_data_frame(edges, directed=TRUE, vertices=nodes)
    
    #Create the simple paths asp 
    asp <- all_simple_paths(gph, "Steve Sweet", "Robert Zero")
    asp2 <- all_simple_paths(gph, "Amy Adamas", "Robert Zero")

Instead I would like something like:

asp <- all_simple_paths(gph, c("Steve Sweet","Amy Adams"), "Robert Zero")

which would give me the 12 paths instantly


Solution

  • Try sapply with all_simple_paths

    asp <- unlist(
      sapply(
        c("Steve Sweet", "Amy Adams"),
        all_simple_paths,
        graph = gph,
        to = "Robert Zero"
      ),
      recursive = FALSE
    )
    

    which gives

    > asp
    $`Steve Sweet1`
    + 4/23 vertices, named, from 6674620:
    [1] Steve Sweet  Tom Thompson Roger Rabbit Robert Zero
    
    $`Steve Sweet2`
    + 4/23 vertices, named, from 6674620:
    [1] Steve Sweet      Tom Thompson     Victor Valentino Robert Zero
    
    $`Steve Sweet3`
    + 5/23 vertices, named, from 6674620:
    [1] Steve Sweet     Ulrich Uxbridge Barry Beane     Henry Handler
    [5] Robert Zero
    
    $`Steve Sweet4`
    + 5/23 vertices, named, from 6674620:
    [1] Steve Sweet     Ulrich Uxbridge Barry Beane     Charlie Cheese
    [5] Robert Zero
    
    $`Steve Sweet5`
    + 5/23 vertices, named, from 6674620:
    [1] Steve Sweet     Ulrich Uxbridge Barry Beane     Imogene Isler
    [5] Robert Zero
    
    $`Steve Sweet6`
    + 5/23 vertices, named, from 6674620:
    [1] Steve Sweet       Ulrich Uxbridge   Barry Beane       Peter Platteville
    [5] Robert Zero
    
    $`Steve Sweet7`
    + 5/23 vertices, named, from 6674620:
    [1] Steve Sweet     Ulrich Uxbridge Barry Beane     Roger Rabbit
    [5] Robert Zero
    
    $`Amy Adams1`
    + 4/23 vertices, named, from 6674620:
    [1] Amy Adams     Barry Beane   Henry Handler Robert Zero
    
    $`Amy Adams2`
    + 4/23 vertices, named, from 6674620:
    [1] Amy Adams      Barry Beane    Charlie Cheese Robert Zero
    
    $`Amy Adams3`
    + 4/23 vertices, named, from 6674620:
    [1] Amy Adams     Barry Beane   Imogene Isler Robert Zero
    
    $`Amy Adams4`
    + 4/23 vertices, named, from 6674620:
    [1] Amy Adams         Barry Beane       Peter Platteville Robert Zero
    
    $`Amy Adams5`
    + 4/23 vertices, named, from 6674620:
    [1] Amy Adams    Barry Beane  Roger Rabbit Robert Zero