R 中的 For 循环(不知道如何停止循环并继续我的其余代码)
For loop in R(no clue how stop the loop and continue with the rest of my code)
我想在 if 条件变为真时停止循环并继续我的代码的下一行。当我 运行 this 时,我得到一个错误,即 blocks[[i]] 中的下标 i 越界。有什么想法吗?
for(i in 1:length(blocks)){
if(length(blocks[[i]]) == 0){
path <- path[ -i , -i]
modes = rep("A", nrow(path))
blocks[[i]] = NULL
}
}
注意:我已经阅读了循环、下一步、停止和中断的帮助
使用 STOP 命令,下面的代码应该可以工作
for(i in 1:length(blocks)){
if(length(blocks[[i]]) == 0){
path <- path[ -i , -i]
modes = rep("A", nrow(path))
blocks[[i]] = NULL
` stop("Outside bounds")
}
}
我无法解析您的标题和描述。在我看来你不想停止循环,而是继续整个 object blocks
。这可能会有所帮助,当长度不同于 0:
时,它应该跳到下一次迭代
for(i in 1:length(blocks)){
if(length(blocks[[i]]) != 0) {
next
} else if(length(blocks[[i]]) == 0){
path <- path[ -i , -i]
modes = rep("A", nrow(path))
blocks[[i]] = NULL
}
}
如果我没理解错的话,你想在条件为真时循环,在条件为假时退出循环。所以你应该使用 while
控制流运算符,而不是 for
.
i <- 1
while(i<=length(blocks) & length(blocks[[i]])!=0){
i <- i+1
}
# check that we exited the loop because there was a zero
# and not because we went through all the blocks
if(i != length(blocks+1)) {
path <- path[ -i , -i]
modes = rep("A", nrow(path))
blocks[[i]] = NULL
}
# rest of your code
但是这里确实不需要循环。
# apply 'length' to every element of the list blocks
# returns a vector containing all the lengths
all_length <- sapply(blocks, FUN=length)
# check that there is at least one zero
if(any(all_length==0)) {
# find the indexes of the zeros in 'all_length'
zero_length_ind <- which(all_length==0)
# this is the index of the first zero
i <- min(zero_length_ind)
}
我不知道你想做什么,但如果你的计划是按顺序处理所有 'i',你实际上可能想使用 zero_length_ind
并一次处理所有零.
例如,如果你想删除path
中对应于blocks
中零长度的所有值,你应该直接这样做:
path <- path[-zero_length_ind,-zero_length_ind]
(注意,如果块中没有零长度元素,那么zero_length_ind
将是integer(0)
(即一个空整数向量)并且你不能用它来索引path
。这可能会为您节省一些调试时间。)
我想在 if 条件变为真时停止循环并继续我的代码的下一行。当我 运行 this 时,我得到一个错误,即 blocks[[i]] 中的下标 i 越界。有什么想法吗?
for(i in 1:length(blocks)){
if(length(blocks[[i]]) == 0){
path <- path[ -i , -i]
modes = rep("A", nrow(path))
blocks[[i]] = NULL
}
}
注意:我已经阅读了循环、下一步、停止和中断的帮助
使用 STOP 命令,下面的代码应该可以工作
for(i in 1:length(blocks)){
if(length(blocks[[i]]) == 0){
path <- path[ -i , -i]
modes = rep("A", nrow(path))
blocks[[i]] = NULL
` stop("Outside bounds")
}
}
我无法解析您的标题和描述。在我看来你不想停止循环,而是继续整个 object blocks
。这可能会有所帮助,当长度不同于 0:
for(i in 1:length(blocks)){
if(length(blocks[[i]]) != 0) {
next
} else if(length(blocks[[i]]) == 0){
path <- path[ -i , -i]
modes = rep("A", nrow(path))
blocks[[i]] = NULL
}
}
如果我没理解错的话,你想在条件为真时循环,在条件为假时退出循环。所以你应该使用 while
控制流运算符,而不是 for
.
i <- 1
while(i<=length(blocks) & length(blocks[[i]])!=0){
i <- i+1
}
# check that we exited the loop because there was a zero
# and not because we went through all the blocks
if(i != length(blocks+1)) {
path <- path[ -i , -i]
modes = rep("A", nrow(path))
blocks[[i]] = NULL
}
# rest of your code
但是这里确实不需要循环。
# apply 'length' to every element of the list blocks
# returns a vector containing all the lengths
all_length <- sapply(blocks, FUN=length)
# check that there is at least one zero
if(any(all_length==0)) {
# find the indexes of the zeros in 'all_length'
zero_length_ind <- which(all_length==0)
# this is the index of the first zero
i <- min(zero_length_ind)
}
我不知道你想做什么,但如果你的计划是按顺序处理所有 'i',你实际上可能想使用 zero_length_ind
并一次处理所有零.
例如,如果你想删除path
中对应于blocks
中零长度的所有值,你应该直接这样做:
path <- path[-zero_length_ind,-zero_length_ind]
(注意,如果块中没有零长度元素,那么zero_length_ind
将是integer(0)
(即一个空整数向量)并且你不能用它来索引path
。这可能会为您节省一些调试时间。)