假设我有一个列表,
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)
时,它返回一个与输入相同的列表,没有赋值给矢量。
那么有人可以告诉我我的功能有什么问题吗?
答案 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"