【发布时间】:2016-03-06 12:44:32
【问题描述】:
我需要生成数列如下:
1 1,2 1,2,3 ... 1,2,3...,n 2 2,3 2,3,4 ... 2,3,4,...,n ... ... n-1 n-1,n n
我来自其他编程语言,循环非常好。但我知道 R 社区更喜欢所谓的向量化操作而不是循环(更有效,尽管我还没有阅读所有关于为什么会这样的细节)。
所以,我首先想到的就是循环。而且我编写的这段代码确实可以完成这项工作(R 大师说 euhh in 3,2,1...)
n <- 30
accum <- list()
for (x in 1:n) {
for (y in x:n) {
accum[[paste(x,y)]] <- x:y
}
}
但这是丑陋的代码(我猜效率不高)。
那么,解决我的问题的聪明的 R 风格代码是什么?
我当然没有掌握矢量化操作和应用族函数。但我最好的方法是:
n <- 30
accum <- lapply(1:n, FUN = function(x){lapply(x:n, FUN = seq, from = x)})
不知道这是否是好的 R 风格编码,但它几乎完成了工作。这个解决方案的问题在于它生成了一个包含n 元素的列表,这些元素也是列表并包含序列。但我想要的是一个包含 465 个元素的列表(在 n=30 的情况下),因此每个序列一个元素,而不需要此解决方案产生的所有列表嵌套。
我非常感谢 R 世界中聪明而优雅的解决方案。
【问题讨论】:
-
第二个解决方案,
unlist(accum, rec=FALSE)
标签: r vectorization lapply