将Googleway出口转换为数据框时出错

时间:2019-03-05 14:18:51

标签: r lapply google-distancematrix-api

我一直在利用a previous question答案中的代码取得巨大成功。昨晚,在多次成功使用代码后,尝试执行代码的第二部分以访问列表结果时,我开始收到错误消息。没有创建lst_elements列表。这是我的代码。

# Run Google Distance API ALl Transit
res <- lapply(1:nrow(Lankenau), function(x) {
  google_distance(origins = c(Lankenau[x,"LAT"],Lankenau[x,"LONG"]),
                  destinations = c(Lankenau[x,"O_Lat"],Lankenau[x,"O_Long"]),
                  mode = "transit",arrival_time = time)})

lst_elements <- lapply(res, function(x){
   stats::setNames(
     cbind(
       distance_elements(x)[[1]][['duration']],
       distance_elements(x)[[1]][['distance']]
     )
     , c("duration_text", "duration_value", "distance_text", "distance_value")
   )
 })

和收到的错误

Error in names(object) <- nm : attempt to set an attribute on NULL 
3.
stats::setNames(cbind(distance_elements(x)[[1]][["duration"]], 
    distance_elements(x)[[1]][["distance"]]), c("duration_text", 
    "duration_value", "distance_text", "distance_value")) 
2.
FUN(X[[i]], ...) 
1.
lapply(res, function(x) {
    stats::setNames(cbind(distance_elements(x)[[1]][["duration"]], 
        distance_elements(x)[[1]][["distance"]]), c("duration_text", 
        "duration_value", "distance_text", "distance_value")) ... 

任何提示都很棒!我不确定发生了什么。完全相同的优点仍然适用于其他数据框。这是否表明错误源于data.frame本身?

1 个答案:

答案 0 :(得分:1)

由于google_distance()调用可能丢失或输入错误,可能是特定于数据的,其中NULL返回到 res 列表中的相应位置。

请考虑包装tryCatch以返回那些问题元素的NA的单行数据帧。如果所有元素都显示为单行NA,则google_distance()的所有运行都会失败。

lst_elements <- lapply(res, function(x){
   tryCatch(setNames(cbind(distance_elements(x)[[1]][['duration']],
                           distance_elements(x)[[1]][['distance']]
                     ), c("duration_text", "duration_value", 
                          "distance_text", "distance_value")
                     ),
            error = function(e) 
                        data.frame(duration_text=NA, duration_value=NA, 
                                   distance_text=NA, distance_value=NA)
            )      
})

final_df <- do.call(rbind, lst_elements)