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