vec <- c(1, 3, 2, 37)
我想连续地连接这个向量,这样输出看起来像这样:
> output
[[1]]
[1] 1
[[2]]
[1] 1 3
[[3]]
[1] 1 3 2
[[4]]
[1] 1 3 2 37
我写了一个函数来完成这个任务,但它没有给我正确的输出:
myfun <- function(vec){
output = vector("list", length(vec))
output[[1]] = vec[1]
for(i in 2:length(vec)){
output[[i]] = paste(output[[i - 1]], vec[i])
output[[i]] = as.numeric(strsplit(output[[i]], " ")[[1]])
}
return(output)
}
> myfun(c(1, 3, 2, 37))
[[1]]
[1] 1
[[2]]
[1] 1 3
[[3]]
[1] 1 2
[[4]]
[1] 1 37
5条答案
按热度按时间fcwjkofz1#
一个直接的方法是
Reduce
:有一个
purrr::accumulate
函数可以完成同样的事情:(编辑为合并注解,仅使用
c()
作为函数,简单得多。wgmfuz8q2#
我们可以使用
lapply
和head
(或[
)来实现:seq_along(vec)
类似于1:length(vec)
(我们也可以使用它,但seq_along
在极端情况下更安全);lapply
被赋予一个函数时,它通常调用一次,其中第一个参数包含值(将连续地从1到4);由于我们包含了x=vec
(这是head
的第一个参数),那么lapply
将该数字作为head
的下一个参数,恰好是n=
。我们也可以做
lapply(seq_along(vec), function(z) vec[1:z])
。vec[1:z]
实现)明显比使用head
快,我应该知道这一点。mccptt673#
我想不出比
Reduce
(@joran)或lapply
(@r2evans)更好的解决方案,它们已经足够高效和简洁了。这里是另一个基础R选项***但只是为了好玩***
5rgfhyps4#
如果这样做的原因是为了以后可以迭代列表,例如,求和
那么我们可以通过使用rollapplyr来避免首先创建L:
注意事项
vec取自问题
41ik7eoe5#
另一个基本R方法使用
matrix
,只是为了完整性