R 数列,通过迭代

R 数列,通过迭代,r,sequence,R,Sequence,我有下面的指数向量 V_ind = cumsum(c(10,9,8,7,6,5,4,3,2,1)) [1] 10 19 27 34 40 45 49 52 54 55 我创建了以下FOR循环 k=1 for(ind in V_ind){ if(ind<=10){ print("ok") }else{ print(c(V_ind[1:k])) k = k + 1 } } 然而,我想得到的是以下结果 [1] "ok" [1] 1

我有下面的指数向量

V_ind = cumsum(c(10,9,8,7,6,5,4,3,2,1))
[1] 10 19 27 34 40 45 49 52 54 55
我创建了以下FOR循环

k=1

for(ind in V_ind){
 if(ind<=10){
  print("ok")
 }else{
  print(c(V_ind[1:k]))
  k = k + 1
 }

}
然而,我想得到的是以下结果

[1] "ok"
[1] 10
[1]  9 10 19
[1]  8  9 10 18 19 27
[1]  7  8  9 10 17 18 19 26 27 34
[1]  6  7  8  9 10 16 17 18 19 25 26 27 33 34 40
[1]  5  6  7  8  9 10 15 16 17 18 19 24 25 26 27 32 33 34 39 40 45
[1]  4  5  6  7  8  9 10 14 15 16 17 18 19 23 24 25 26 27 31 32 33 34 38 39 40 44 45 49
[1]  3  4  5  6  7  8  9 10 13 14 15 16 17 18 19 22 23 24 25 26 27 30 31 32 33 34 37 38 39 40 43 44 45 48 49 52
[1]  2  3  4  5  6  7  8  9 10 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 29 30 31 32 33 34 36 37 38 39 40 42 43 44 45 47 48 49 51 52 54
结果如下:

  • 在第一次迭代中,我们只是打印OK

  • 在第二次迭代中,我们提取向量的第一个元素
    V_ind

  • 在第三次迭代中,我们提取向量
    V_ind
    的第一个和第二个元素,以及向量
    V_ind
    的第一个元素减去1,即数字
    9

  • 在第四次迭代中,我们提取向量
    V_ind
    的第一、第二和第三个元素,以及第一个元素减去1,即
    9
    ,第一个元素减去2,即
    8
    ,第二个元素减去1,即
    18

  • 在第五次迭代中,我们分别提取向量
    V_ind
    的第一、第二、第三和第四个元素以及第一个元素减去1、2、3,即
    7、8、9
    ,第二个元素减去1和2,即
    17、18
    ,第三个元素减去1,即
    26


  • 这个过程一直持续到FOR循环的结束。这甚至可以用R以通用方式实现吗?

    使用
    purrr
    的一个选项可以是:

    map(.x = accumulate(V_ind, c),
        ~ map2(.x,
               rev(seq_along(.x) - 1),
               function(y, z) seq(y - z, y, 1)) %>%
            reduce(c))
    
    [[1]]
    [1] 10
    
    [[2]]
    [1]  9 10 19
    
    [[3]]
    [1]  8  9 10 18 19 27
    
    [[4]]
     [1]  7  8  9 10 17 18 19 26 27 34
    
    [[5]]
     [1]  6  7  8  9 10 16 17 18 19 25 26 27 33 34 40
    
    [[6]]
     [1]  5  6  7  8  9 10 15 16 17 18 19 24 25 26 27 32 33 34 39 40 45
    
    [[7]]
     [1]  4  5  6  7  8  9 10 14 15 16 17 18 19 23 24 25 26 27 31 32 33 34 38 39 40 44 45 49
    
    [[8]]
     [1]  3  4  5  6  7  8  9 10 13 14 15 16 17 18 19 22 23 24 25 26 27 30 31 32 33 34 37 38 39 40 43 44 45 48 49 52
    
    [[9]]
     [1]  2  3  4  5  6  7  8  9 10 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 29 30 31 32 33 34 36 37 38 39 40 42 43 44 45 47 48
    [42] 49 51 52 54
    
    [[10]]
     [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
    [42] 42 43 44 45 46 47 48 49 50 51 52 53 54 55
    
    如果这很重要,您可以简单地反向添加“OK”迭代:

    append("OK",
           map(.x = accumulate(V_ind, c),
               ~ map2(.x,
                      rev(seq_along(.x) - 1),
                      function(y, z) seq(y - z, y, 1)) %>%
                   reduce(c)))
    
    同样,如果需要从原始向量中删除最后一个数字:

    append("OK",
           map(.x = accumulate(head(V_ind, -1), c),
               ~ map2(.x,
                      rev(seq_along(.x) - 1),
                      function(y, z) seq(y - z, y, 1)) %>%
                   reduce(c)))
    
    for(沿(V_ind)顺序排列的i){
    如果(i==1){
    打印(“确定”)
    }else如果(i==2){
    打印(V_ind[1])
    }否则{
    
    out_vector另一个选项,
    序列
    起着关键作用

    lapply(seq_along(x), function(n){
      x[rep(1:n, n:1)] - rev(sequence(1:n) - 1)
    })
    
    # [[1]]
    # [1] 10
    # 
    # [[2]]
    # [1]  9 10 19
    # 
    # [[3]]
    # [1]  8  9 10 18 19 27
    # 
    # [[4]]
    # [1]  7  8  9 10 17 18 19 26 27 34
    
    其中,
    x
    是向量的子集:

    x = cumsum(10:7)
    
    如果需要,只需对上述内容执行“确定”

    lapply(seq_along(x), function(n){
      x[rep(1:n, n:1)] - rev(sequence(1:n) - 1)
    })
    
    # [[1]]
    # [1] 10
    # 
    # [[2]]
    # [1]  9 10 19
    # 
    # [[3]]
    # [1]  8  9 10 18 19 27
    # 
    # [[4]]
    # [1]  7  8  9 10 17 18 19 26 27 34
    
    x = cumsum(10:7)