如何用更精简的R代码生成回归首元素的序列列表?
简化生成首尾重复序列的R实现方案
首先,先回应你关于被投反对票的疑惑:Stack Overflow上的反对票通常是因为问题初期描述不够清晰(比如一开始没明确你要生成的是「每个起始数x对应序列x, x+1, x+2, x」),不过你补充后的问题已经很明确了,不用太在意~
回到你的核心需求:生成一组以每个i元素开头、包含连续3个数后再回到开头的序列,并且想要更简洁(字符数更少)的实现。下面给你几种优化方案:
1. 最短字符数的lapply写法(R 4.1+)
利用R 4.1版本引入的箭头匿名函数\(x)替代传统的function(x),能大幅缩短字符数:
i <- seq(1,24,3) i_list <- lapply(i, \(x) c(x:(x+2),x))
对比你原来的lapply写法,少了function这9个字符,简洁很多。
2. purrr::map的简化版
你原来的purrr写法已经很简洁了,其实可以保持这个风格,它的字符数已经接近最优:
i_list <- purrr::map(i, ~c(.:(.+2), .))
这个写法和箭头函数版的lapply字符数相差无几,适合习惯purrr生态的场景。
3. 关于replicate()的适用性
replicate()的设计初衷是重复执行同一个无参数/固定参数的表达式,而你的需求是给每个不同的起始值x生成序列,所以replicate()并不适合直接实现这个需求——硬要用的话反而会写出更繁琐的代码(比如结合索引调用i),不如用lapply或purrr::map高效简洁。
4. 向量化的另类实现(适合追求新奇写法)
如果想尝试非循环类的写法,可以用outer生成所有序列元素,再拆分:
i_list <- split(c(outer(i, 0:2, `+`), i), rep(i, each=4))
不过这个写法字符数并没有更短,只是提供一种不同的思路。
总结下来,箭头函数版的lapply是字符数最少、可读性也不错的方案,推荐使用~
内容的提问来源于stack exchange,提问作者RobinLovelace
相关产品推荐
相关产品推荐

