2014-11-06 67 views
2

我有一個嵌套的列表結構,我正在使用它作爲類的基礎。每個類對象都可以包含另一個類對象的實例,它將用於鏈接一系列命令。我試圖重載+運算符,以便能夠迭代地建立一組命令。這需要找到「最深」的命令並附加到它。這是我沒有任何運氣的地方。追加到任意嵌套列表

# an aribitrarily nested list 
tmp <- list(x = list(x = list(x = list()))) 

# find deepest 'x' 
last.x <- function(e) { 
    while(!is.null(e$x)){ 
    e <- e$x 
    } 
    return(e) 
} 

# I need to be able to append to the deepest 'x' in the list. Ideally: 
last.x(tmp)$x <- list() 

其產生錯誤:

Error in last.x(tmp)[["x"]] <- list() : 
    could not find function "last.x<-" 

我正在尋找某種方式通過引用來訪問「最深的」 x和孩子追加到它。

回答

4

如果您從R中的數據結構中提取一些值,然後更改提取的對象,這不會影響原始數據結構(也就是說,提取的對象不會像指向原始數據的指針)。例如,考慮從虹膜數據集複製的物種,然後改變提取的值:

species <- iris$Species 
species[1] <- "virginica" 
species[1] 
# [1] virginica 
# Levels: setosa versicolor virginica 
iris$Species[1] 
# [1] setosa 
# Levels: setosa versicolor virginica 

但是,你仍然可以完成你想做的事通過構建新的嵌套表與孩子添加在最低水平。下面是一個使用遞歸功能的方法:

tmp 
# $x 
# $x$x 
# $x$x$x 
# list() 

rec <- function(x) { 
    if (is.null(x$x)) return(list(x=list())) 
    else return(list(x=rec(x$x))) 
} 
rec(tmp) 
# $x 
# $x$x 
# $x$x$x 
# $x$x$x$x 
# list() 
1

提供我的解決方案,希望對他人有用。感謝josilber提供靈感。在試圖創建一個簡單的例子時,我排除了一些使直接應用答案變得困難的細節。

開始與三個對象中,每個深度爲1的列表:

`+.obj` <- function(e1, e2) { 
    if (is.null(e1$x)) { 
    e1$x <- e2 
    } else { 
    e1$x <- e1$x + e2 
    } 
    return(e1) 
} 

實施例輸出

res <- obj1 + obj2 + obj3 

> str(res) 
List of 1 
$ x:List of 1 
    ..$ x: list() 
    .. ..- attr(*, "class")= chr "obj" 
    ..- attr(*, "class")= chr "obj" 
- attr(*, "class")= chr "obj" 

該嵌套後續對象更深一層
obj1 <- structure(list(), class='obj') 
obj2 <- structure(list(), class='obj') 
obj3 <- structure(list(), class='obj') 

定製加法函數