R Repeat for循环满足中断条件,但不中断

R Repeat for loop is meeting break condition, but not breaking

我有一个名为“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

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

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

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

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

在外部 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