2014-11-06 71 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') 

定制加法函数