想要一个递归函数,对其args进行编号,递归到列表中

时间:2015-06-11 02:58:04

标签: r recursion

假设我有一个列表,

l<-list(a="",b="",c=list(d="",e=list(f=""),g=""))  

看起来像:

List of 3
 $ a: chr ""
 $ b: chr ""
 $ c:List of 3
  ..$ d: chr ""
  ..$ e:List of 1
  .. ..$ f: chr ""
  ..$ g: chr ""  

现在我想根据列表的顺序将值分配给最后的字符向量。例如,l$a的值为&#34; 1&#34;,l$c$d的值为&#34; 3.1&#34;,&#34;的值为&#34;升$ C $ E $ F&#34;将是&#34; 3.2.1&#34;。
我创建了一个递归函数来生成和赋值:

sequencize<-function(list,loopn="1"){
  if(!is.list(list)){
    list<-loopn
  }else{
    for(i in 1:length(list)){
      sublist<-list[[i]]
      newloopn<-paste(loopn,i,sep=".")
      sequencize(sublist,newloopn)
    }
  }
  list
}

然而,当我运行sequencize(l)时,它返回一个与输入相同的列表,没有赋值给矢量。
那么有人可以告诉我我的功能有什么问题吗?

2 个答案:

答案 0 :(得分:0)

您需要确保在递归函数中实际构造并返回一个新列表:

sequencize <- function(list, loopn="1") {
  if (!is.list(list)){
    loopn
  } else {
    l <- lapply(1:length(list), function(i) sequencize(list[[i]], paste(loopn,i,sep=".")))
    names(l) <- names(list)
    l
  }
}
str(sequencize(l))
# List of 3
#  $ a: chr "1.1"
#  $ b: chr "1.2"
#  $ c:List of 3
#   ..$ d: chr "1.3.1"
#   ..$ e:List of 1
#   .. ..$ f: chr "1.3.2.1"
#   ..$ g: chr "1.3.3"

答案 1 :(得分:0)

在阅读了回复并奋斗了一天之后,我终于明白了问题是什么,并找到了解决方案:

sequencize<-function(lst,loopn="1"){
        if(!is.list(lst)){
                lst<-loopn
        }else{
                for(i in 1:length(lst)){
                        lst[[i]]<-sequencize(lst[[i]],paste(loopn,i,sep="."))
                }
                lst
        }
}

> str(sequencize(l))
List of 3
 $ a: chr "1.1"
 $ b: chr "1.2"
 $ c:List of 3
  ..$ d: chr "1.3.1"
  ..$ e:List of 1
  .. ..$ f: chr "1.3.2.1"
  ..$ g: chr "1.3.3"