R使用itcSegment处理LiDAR数据时循环向列表添加元素仅最后一位有值
核心问题原因
- 循环逻辑错误:你当前写的
for (i in j)中j是单值(总批次数),循环只会执行1次,i直接等于最终的批次号,因此只有列表的对应最后一个位置被赋值,其余位置均未触发写入。 - 切片边界异常:如果总行数不是10000的整数倍,最后一批切片范围会超出数据集行数,触发下标越界错误。
- 变量名笔误:
plot语句中调用的se对象未定义,你实际运算生成的对象是se1。
修正后代码
library(itcSegment) library(dplyr) dataset <- read.table(file = "dataset_test5.txt", header = T, sep = "\t") # 计算总批次数,用向上取整保证所有数据都被处理 j <- ceiling(nrow(dataset)/10000) output.list <- vector(mode = "list", length = j) # 提前初始化列表,提升运行效率 k <- 1 for (i in 1:j) { # 遍历1到总批次数,每批次执行一次 # 切片上限取数据集行数和k+9998的最小值,避免最后一批越界 end_idx <- min(k+9998, nrow(dataset)) subdata <- slice(dataset, k:end_idx) se1 <- itcLiDAR(subdata$X, subdata$Y, subdata$Z, epsg = 32632, resolution = 1, MinSearchFilSize = 5, MaxSearchFilSize = 11, TRESHSeed = 0.55, TRESHCrown = 0.6, minDIST = 5, maxDIST = 40, HeightThreshold = 10, cw = 1) output.list[[i]] <- se1 plot(se1, axes = T, add = T) k <- k + 9999 }
额外优化建议
- 提前初始化指定长度的列表,比动态追加列表元素的运行效率更高,尤其批次多的时候差异明显
- 用
ceiling计算总批次数,避免因行数不足整数倍导致最后一批数据丢失
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

