我有一个特殊的要求,即我事先不知道需要多少级分支。我需要将数据结构作为一个列表,因为我也不知道每个分支中将存储多少个元素。
现在,我很难将分支编码为1,2,3,4或5。我最初以为我永远不需要超过3个层次的层次结构。尽管现在不是这种情况。我已经降至5级了;每次只需更新下面的代码即可。
# list of lists of lists of ...
# i.e. declaring the data structure that holds the indices for each portfolio!
l = vector("list", num_ports[1]);
if(length(num_ports) > 1) { for(i in 1:num_ports[1]) {
l[[i]] = vector("list", num_ports[2]);
if(length(num_ports) > 2) { for(j in 1:num_ports[2]) {
l[[i]][[j]] = vector("list", num_ports[3]);
if(length(num_ports) > 3) { for(k in 1:num_ports[3]) {
l[[i]][[j]][[k]] = vector("list", num_ports[4]);
if(length(num_ports) > 4) { for(k in 1:num_ports[4]) {
l[[i]][[j]][[k]][[p]] = vector("list", num_ports[5]);
# more than 4 levels not allowed as of now!
# index the list by: l[[i]][[j]][[k]][[p]][[q]] where q in 1:num_ports[5]
}
}
}
}
}
}
}
}
我知道要在其上创建层次结构的数组num_ports
。
注意: :我稍后会更新并访问此列表。那里的代码更加混乱。我可能永远都不需要超过5个级别,但是当前的方法远非优雅。
答案 0 :(得分:3)
这可以简化很多。 l[[i]][[j]][[k]][[p]]
与l[[c(i,j,k,p)]]
是同一件事。您可以通过构造向量的任何方式来构造索引向量,而无需事先知道会持续多长时间。
答案 1 :(得分:1)
这是构建“空”嵌套列表的方法:
mainCtrl.mainGrid.isRowSelectable
为Reduce(function(x, y) replicate(y, x, F), rev(num_ports), NULL)
提供解决方案和我的回报:
num_ports <- c(2, 3)
它也适用于更复杂的情况。