首页 > 解决方案 > 单线创建迭代序列列表?

问题描述

我需要创建一个总是回到序列中第一个数字的序列列表。我已经编写了下面的代码,但它看起来很笨重。有没有使用更少字符的解决方案?


(i = seq(1, 24, by = 3))
#> [1]  1  4  7 10 13 16 19 22
(i_list = purrr::map(i, ~c(.:(. + 2), .)))
#> [[1]]
#> [1] 1 2 3 1
#> 
#> [[2]]
#> ...

编辑:这是一种lapply(). 不知道为什么这会被否决,欢迎任何关于如何改进问题的建议!

(i_list = lapply(i, function(x) c(x:(x+2), x)))

我想知道是否有办法replicate()添加该标签。

标签: rlistiterationlapplyreplicate

解决方案


在矩阵中,而不是列表形式中,有:

cbind(matrix(1:24, ncol=3,byrow=TRUE),seq(1, 24, by = 3))

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    1
[2,]    4    5    6    4
[3,]    7    8    9    7
[4,]   10   11   12   10
[5,]   13   14   15   13
[6,]   16   17   18   16
[7,]   19   20   21   19
[8,]   22   23   24   22

然后你会迭代矩阵的行而不是列表的元素。

或者,如果您喜欢代码高尔夫:

> seq(1,24,by=3) + t(matrix(c(0,1,2,0),ncol=8,nrow=4))
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    1
[2,]    4    5    6    4
[3,]    7    8    9    7
[4,]   10   11   12   10
...

+但是在这种情况下,您在构建 RHS 方面投入了多少工作?你的问题是如何参数化的?

这取决于i具有规则模式(对步长进行一些调整),它不适用于任意i序列。


推荐阅读