R循环迭代时从列表删除元素报subscript out of bounds错误如何解决
错误原因
你遇到的subscript out of bounds下标越界错误,核心原因是R的for循环遍历序列是在循环初始化时就生成固定值的,你后续修改x的取值不会改变已经生成的1:x遍历序列。当你删除元素后a的长度缩短,n还会按照初始序列继续增大,就会访问到a不存在的下标。
解决方案
可以在同一个循环内实现两个需求,只需要将内层的for循环替换为手动控制步进的while循环即可,修正后的代码如下:
for(i in seq_along(split)) { a <- strsplit(split[[i]], "\\.") x <- length(a) n <- 1 # 用while循环手动控制遍历位置 while(n <= x) { if (a[[n]][1] == 0) { # 拼接匹配到的条目存入矩阵 matched_val <- paste(a[[n]], collapse = ".") atmatrix[i, n] <- matched_val # 直接删除当前匹配到的条目 a <- a[-n] # 更新列表长度,删除元素后n不需要递增,下一轮直接判断前移到当前位置的新元素 x <- length(a) } else { # 未匹配到则遍历下一个位置 n <- n + 1 } } # 把处理后的剩余条目拼接回字符串,更新原split列表 split[[i]] <- sapply(a, paste, collapse = ".") }
代码修改说明
- 用
seq_along(split)替代1:length(split),避免split为空时生成错误的遍历序列 - 内层替换为while循环,手动控制遍历位置,适配删除元素后列表长度动态变化的场景
- 去掉了循环内对整个
a反复拆分、拼接的冗余操作,仅对当前匹配到的单个条目做拼接,运行效率更高 - 如果不需要atmatrix中留存删除条目对应的空位,可在循环结束后统一清理矩阵中的空值
内容的提问来源于stack exchange,提问作者esti
相关产品推荐
相关产品推荐

