【问题标题】:R Repeat for loop is meeting break condition, but not breakingR重复for循环满足中断条件,但没有中断
【发布时间】:2020-12-12 01:12:21
【问题描述】:

我有一个名为“M”的 29 个矩阵的列表,如果一个矩阵的行数少于 227 行,我想继续添加 NA 行,直到它有 227 行。

我的代码完全符合我的要求,但是,由于中断不起作用,我需要手动停止 R。

library(tibble)

repeat{
  for(i in 1:29){
    if(dim(M[[i]])[1] < 227){       # if a matrix has less than 227 rows, I want to add a row
      M[[i]] <- M[[i]] %>% add_row
      if(dim(M[[29]])[1] == 227){     # if the final matrix has 227 rows, I want it to break
        break
      }
    }
  }
}

之后我检查了中断条件,确实如此。

identical(dim(M[[29]])[1], 227)
[1] TRUE

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: r loops break


    【解决方案1】:

    一个选项是使用sapply 动态获取行数,采用max ('mx')。用它来检查'M'的每个元素,if它低于'mx',然后将新行分配为NA并返回矩阵

    mx <- max(sapply(M, nrow))
    M1 <- lapply(M, function(x) {
               if(nrow(x) < mx) {
                 x[(nrow(x) + 1):mx,] <- NA
                }
                x})                                    
    

    【讨论】:

    • 谢谢!这是一个很好的选择,感谢您的详细解释
    【解决方案2】:

    你打破了内部循环for (i in 1:29)。你永远不会破坏外部的repeat 循环。

    【讨论】:

    • 感谢您的解释,您知道更改我上面的代码以打破重复循环的快速方法吗?
    • 其实这个问题已经在另一个回答中回答过了,还是谢谢你!
    【解决方案3】:

    在外部repeat 循环结束之前断开循环。然后代码就可以工作了。

    首先,我将组成一个数据集。
    它将尝试创建最多包含max_rows 行的矩阵。

    library(magrittr)
    library(tibble)
    
    df <- tibble(x = 1:3, y = 3:1)
    M <- list(df, df, df)
    max_rows <- 8
    n <- length(M)
    
    repeat{
      for(i in seq_along(M)){
        if(nrow(M[[i]]) < max_rows){       # if a matrix has less than 227 rows, I want to add a row
          M[[i]] <- M[[i]] %>% add_row
        }
      }
      if(nrow(M[[n]]) == max_rows){     # if the final matrix has 227 rows, I want it to break
        break
      }
    }
    
    nrow(M[[n]])
    #[1] 8
    

    【讨论】:

    • 有趣,谢谢!现在查看您的代码,我能够像您一样移动括号,并且效果很好。我想我现在明白了 break 是怎么回事,它现在指向重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2019-04-02
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多