R中使用GET()遍历data.table时报错length(url) == 1 is not TRUE的问题
解决方案
你遇到的报错本质是自定义returnMLA仅支持单个邮政编码输入,而data.table默认会将整列向量传入j表达式的函数中,你可以通过以下两种方法实现需求:
方法1:使用data.table按行分组逻辑
通过by = 1:nrow(people)强制每行单独执行函数逻辑,每次仅传入单个邮政编码调用接口:
# 外层嵌套两层list是为了将返回的JSON结构化数据完整存为list列 people[, MLA := list(list(returnMLA(b))), by = 1:nrow(people)]
方法2:将自定义函数向量化
用Vectorize()包装你的自定义函数,让它原生支持向量输入,自动遍历每个元素执行:
# 生成向量化版本函数,SIMPLIFY=FALSE避免自动简化破坏返回的结构化数据 returnMLA_vec <- Vectorize(returnMLA, SIMPLIFY = FALSE) # 直接整列赋值即可 people[, MLA := returnMLA_vec(b)]
可选优化:增加异常捕获
避免个别无效邮政编码导致整段代码运行崩溃,可以给函数增加错误处理逻辑:
returnMLA <- function(postalCode){ tryCatch({ urlMLA <- paste0("https://represent.opennorth.ca/postcodes/", postalCode) res <- GET(urlMLA) data <- fromJSON(rawToChar(res$content)) return(data) }, error = function(e) { return(list(request_error = as.character(e))) }) }
内容的提问来源于stack exchange,提问作者ke.li
相关产品推荐
相关产品推荐

