You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言使用geosphere包逐行计算地理距离pmap传参报错解决

错误原因

报错由两个核心问题导致:

  1. pmap的第二个参数必须传入可调用的函数,原代码直接将distRhumb(c(..1, ..2), c(..3, ..4))作为参数传入,没有将其包裹在匿名函数定义中。..1/..2这类特殊参数仅能在包含...可变参数的函数上下文中被识别,脱离函数环境直接调用时R找不到对应的参数来源,就会抛出no ... to look in的错误。
  2. 代码存在坐标笔误:传入的终点纬度参数错写为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 01:48:34