R语言使用geosphere包逐行计算地理距离pmap传参报错解决
错误原因
报错由两个核心问题导致:
pmap的第二个参数必须传入可调用的函数,原代码直接将distRhumb(c(..1, ..2), c(..3, ..4))作为参数传入,没有将其包裹在匿名函数定义中。..1/..2这类特殊参数仅能在包含...可变参数的函数上下文中被识别,脱离函数环境直接调用时R找不到对应的参数来源,就会抛出no ... to look in的错误。- 代码存在坐标笔误:传入的终点纬度参数错写为
start_lng(起点经度),即使代码能正常运行,计算出的距离结果也是完全错误的。
修正方案
方案1:修正pmap调用逻辑
为pmap传入标准匿名函数,同时修正坐标笔误,使用pmap_dbl直接返回数值型结果,避免生成列表列增加后续处理成本:
library(geosphere) library(tidyverse) library(magrittr) df2021 %<>% mutate( distance = pmap_dbl( list(start_lng, start_lat, end_lng, end_lat), \(lng_start, lat_start, lng_end, lat_end) distRhumb(c(lng_start, lat_start), c(lng_end, lat_end)) ) )
如果使用4.1版本以下的R,将匿名函数替换为
function(lng_start, lat_start, lng_end, lat_end) distRhumb(c(lng_start, lat_start), c(lng_end, lat_end))即可。
方案2:直接使用distRhumb向量化计算(推荐)
distRhumb本身原生支持矩阵格式的批量坐标输入,无需嵌套pmap逐行迭代,代码更简洁、运行效率更高:
df2021 %<>% mutate( distance = distRhumb( cbind(start_lng, start_lat), cbind(end_lng, end_lat) ) )
*注意:
- geosphere系列距离函数要求坐标输入顺序为经度在前、纬度在后,不要调换经纬度顺序否则会得到错误结果。
- 代码中使用
start_lng/end_lng匹配原代码中的列名写法,如果实际数据框里经度列命名为start_long/end_long,替换为对应列名即可。*
内容的提问来源于stack exchange,提问作者GatorAdmiral03
相关产品推荐
相关产品推荐

