使用placement包drive_time()函数报错:vapply: values must be length 11
解决placement包drive_time()函数的vapply长度不匹配错误
你在使用Derek Darves开发的placement包中drive_time()函数时遇到的vapply: values must be length 11错误,大概率是API返回数据结构与函数预期不匹配、参数配置问题,或是包版本兼容导致的。我整理了几个实用的排查和解决方向:
1. 先搞定Google Maps API的基础配置
- 你当前
privkey参数是空字符串,但使用auth="standard_api"时必须填入有效的Google Maps API密钥。没有密钥或密钥权限不足的话,API会返回异常格式的JSON,直接导致vapply处理时长度不匹配。 - 确认你的API项目已经启用了Distance Matrix API——这是
drive_time()依赖的核心服务,没启用的话API会返回错误信息而非正常行程数据。
2. 检查参数设置的合理性
- 你设置了
travel_mode="bicycling",但部分跨城路线可能没有自行车导航数据,API返回的结果字段会缺失,导致函数预期的11个值凑不齐。建议先换成travel_mode="driving"测试,如果能正常运行,就说明是自行车路线数据的问题。 - 尝试把
clean参数改成TRUE,这个参数会清理API返回的冗余数据,有可能修复结构不匹配的问题。 - 另外你的变量名是
howfar_kms但设置了units="imperial",虽然这不会直接引发错误,但建议保持单位和变量名一致,避免后续混淆。
3. 排查包版本兼容性
- 老版本的placement包可能和最新的Google Maps API返回格式不兼容,先更新到最新版本试试:
update.packages("placement") - 同时检查依赖的jsonlite包版本,vapply的错误常和JSON解析后的列表结构有关,确保jsonlite也是最新版:
update.packages("jsonlite")
4. 手动调试API返回内容
- 可以直接调用Google Maps Distance Matrix API查看返回的JSON结构,确认是否符合函数预期:
如果返回的library(httr) response <- GET("https://maps.googleapis.com/maps/api/distancematrix/json", query = list(origins = "350 5th Ave, New York, NY 10118, USA", destinations = "1600 Amphitheatre Pkwy, Mountain View, CA 94043", mode = "bicycling", units = "imperial", key = "你的API密钥")) content(response)rows->elements里的status不是OK,那就是API层面的问题,需要调整参数或检查权限。
5. 简化参数做最小测试
- 先去掉非必要参数,用最基础的调用验证:
如果基础调用能成功,再逐个加回参数(比如bicycling、units等),就能定位到导致错误的具体参数。howfar <- drive_time(address="350 5th Ave, New York, NY 10118, USA", dest="1600 Amphitheatre Pkwy, Mountain View, CA 94043", auth="standard_api", privkey="你的有效API密钥", travel_mode="driving")
内容的提问来源于stack exchange,提问作者zest16
相关产品推荐
相关产品推荐

