R语言绘制等值线图时inSide函数报错:非数值参数参与二元运算
R语言等值线图绘制:inSide函数报错排查与修复
问题背景
参考相关代码绘制等值线图时,将原代码中的date替换为latitude后,执行ctd_mba_bound <- ctd_mba[inSide(bounding_box_list, v, w),]语句报错:
Error in min(c(bnd$x, bnd$y), na.rm = TRUE) - 1 : non-numeric argument to binary operator
已通过str()确认ctd_mba的参数为数值型。
关键代码片段
# 创建边界框 left <- ctd[ctd$latitude == min(ctd$latitude),] %>% select(-temperature) %>% ungroup() %>% mutate(latitude = latitude-0.01) bottom <- ctd %>% group_by(latitude) %>% summarise(depth = min(depth)) %>% mutate(depth = depth-0.01) right <- ctd[ctd$latitude == max(ctd$latitude),] %>% select(-temperature) %>% ungroup() %>% mutate(latitude = latitude+0.01) top <- ctd %>% group_by(latitude) %>% summarise(depth = max(depth)) %>% mutate(depth = depth+0.01) # 筛选边界内的像素 bounding_box_list <- list(bounding_box) names(bounding_box_list[[1]]) <- c("v","w") v <- ctd_mba$latitude w <- ctd_mba$depth ctd_mba_bound <- ctd_mba[inSide(bounding_box_list, v, w),]
错误原因
- 边界框未完整构建:代码仅定义了left、bottom、right、top四个边界段,但未将它们按闭合多边形的顺序拼接为完整的
bounding_box对象,导致传入inSide的边界框无效。 - 列名不匹配函数要求:
inSide(来自mba包)要求边界框数据框必须包含x和y列,你将列名改为v和w后,函数无法识别有效坐标列,进而触发非数值参数错误。
修正方案
步骤1:构建闭合边界框
将四个边界段按顶部→右侧→底部→左侧的顺序拼接,形成闭合多边形,并统一列名为x和y(对应latitude和depth):
# 拼接成闭合的边界框多边形 bounding_box <- rbind(top, right, bottom, left) # 统一列名为inSide要求的x(纬度)和y(深度) colnames(bounding_box) <- c("x", "y")
步骤2:正确调用inSide函数
使用符合要求的列名构建边界框列表,再传入坐标进行筛选:
# 构建边界框列表 bounding_box_list <- list(bounding_box) # 提取待判断的坐标(对应x和y) x <- ctd_mba$latitude y <- ctd_mba$depth # 筛选边界内的点 ctd_mba_bound <- ctd_mba[inSide(bounding_box_list, x, y), ]
额外检查
执行修正代码前,可通过str(bounding_box)确认x和y列均为数值型,避免因数据类型异常导致的问题。
内容的提问来源于stack exchange,提问作者Hyeon Kim
相关产品推荐
相关产品推荐

