2015-07-11 50 views
1

下面的代碼是我的R腳本。我想從我的r腳本的結果列表中獲取$ r [[1]]和$ r1:loop_results。以下是loop_results的第一個元素的外觀樣例。我希望有一個列表只顯示的最短路徑像1和1 2的順序和名單隻包含像A和A B.頂點序列從r中的整套列表中提取元素

[[1]] 
[[1]][[1]] 
[[1]][[1]]$r 
[[1]][[1]]$r[[1]] 
[1] 1 


[[1]][[1]]$r1 
Vertex sequence: 
[1] "A" 


[[1]][[2]] 
[[1]][[2]]$r 
[[1]][[2]]$r[[1]] 
[1] 1 2 


[[1]][[2]]$r1 
Vertex sequence: 
[1] "A" "B" 

這裏是我的[R腳本

library(igraph) 
    g <- graph.ring(5) # the graph 
    V(g)$name <- LETTERS[1:5] # Vertex names 
    # Define functions: 
    val=function(g,i,j) { r=get.shortest.paths(g, i,j ,mode = "out"); return(r) } 
    val_all=function(r) { r1 <- V(g)[r$vpath[[1]]]; return(r1) } 

    loop_results <- list() 
    for (i in 1:5) { 
    loop_results[i] <- list(NULL) 
    for(j in 1:5) { 

     r=val(g ,i, j) 
     print(r[[1]]) 
     r1 = val_all(r) 
     print(r1) 
     loop_results[[i]][[j]] <- list(r=r[[1]], r1=r1) 
    } 
    } 
    loop_results 

我從dput(loop_results)獲得以下輸出:

list(list(structure(list(r = list(1), r1 = structure(1, 
    class ="igraph.vs", env = <environment>)), .Names = c("r", 
    "r1")), structure(list(r = list(c(1, 2)), 
    r1 = structure(c(1, 2), 
    class = "igraph.vs", env = <environment>)), .Names = c("r", "r1")), 
    structure(list(r = list(c(1, 2, 3)), r1 = structure(c(1, 2, 3), 
    class = "igraph.vs", env = <environment>)), .Names = c("r", "r1")), 
    structure(list(r = list(c(1, 5, 4)), r1 = structure(c(1, 5, 4)  class = "igraph.vs",env = <environment>)), 
    .Names = c("r", "r1")), structure(list(r = list(c(1, 5)), r1 =  structure(c(1, 5),class = "igraph.vs", env = <environment>)), .Names = c("r", "r1"))) 

以這種形式爲其餘4個字母中的每一個也。 get.shortest.path函數中的R只會將最短路徑序列作爲數字返回。如果我們有帶有字符串的頂點,那麼我們用我的r腳本中的val_all函數打印出最短路徑結果的頂點序列名稱。

我的主要目標是找到包含具有中間節點的最短路徑序列的列表。就像在我的例子中,我想找到節點「A」和「C」之間的最短路徑,結果就是AB C.然後,我只想打印「B」而不是「A」和「C」的中間節點「,這是我找到最短路徑的節點。爲此,我正在考慮在r中使用setdiff()函數,而對於這個函數,我需要傳遞一個列表,這就是爲什麼我需要前面提到的列表。

+0

我檢查了我的腳本它正在生產outpu噸。我希望通過在顯示R腳本之前提取上面$ r [[1]]的結果列表元素來獲得結果。在我顯示的r腳本之前的列表是半列表。我只想從輸出列表中得到$ r [[1]]的結果。 –

+0

嗨坦率的說,我從我顯示的半列表我希望的輸出是[1] 1,[1] 1 2就像這個序列。我只想從那個列表中取出那些在我的半列表中命名爲[[1]] [[1]] $ r1然後[[1]] [[2]] $ r1這部分我只想獲取的部分從列表中。 –

+0

對此感到抱歉。 –

回答

1

如果要拆分現有列表到基於數據是否與rr1相關聯,可以使用嵌套lapply調用來完成這個兩個列表:

r

lapply(seq_along(loop_results), 
    function(x) lapply(seq_along(loop_results[[x]]), 
     function(y) loop_results[[x]][[y]][["r"]])) 

r1

lapply(seq_along(loop_results), 
    function(x) lapply(seq_along(loop_results[[x]]), 
     function(y) loop_results[[x]][[y]][["r1"]]))