【问题标题】:R parallel foreach loops with spatial data具有空间数据的 R 并行 foreach 循环
【发布时间】:2016-11-24 17:37:17
【问题描述】:

我在 R 中有一个名为 lines 的大型空间线数据框,我想将函数 line2route 应用于 stplanr

为了加快进程,我想将文件分成块并并行运行。

library(doParallel)
batch_size <- ceiling(nrow(lines) / 6)
cl <- makeCluster(6)
registerDoParallel(cl)
    foreach(i = 1:6) %dopar% {
      l_start <- as.integer(1 + (i - 1) * batch_size)
      if(i * batch_size < nrow(lines)){
        l_fin <- as.integer(i * batch_size)
      }else{
        l_fin <- as.integer(nrow(lines))
      }
      lines_sub <- lines[c(l_start:l_fin),]
      rq <- line2route(l = lines_sub, route_fun = route_cyclestreet, plan = "quietest")
      saveRDS(rq, file = paste0("../temp/rq_batch_", i, ".Rds"))
    }

代码将lines分成6个部分并运行函数,然后保存结果。

这在 for 循环中运行良好,但是当我将其更改为 foreach 循环并尝试并行执行时,我收到错误消息

{ 中的错误:任务 1 失败 - "c(" 类对象的分配 \"tbl_df\" 对类对象中的 @'data' 无效 \"空间线数据帧\"; is(value, \"data.frame\") 不是 TRUE", “类 \"tbl\" 对象的赋值对 @'data' 无效 类 \"SpatialLinesDataFrame\" 的对象;是(值, \"data.frame\") is not TRUE", "assignment of an object of class \"data.frame\" 对类对象中的 @'data' 无效 \"空间线数据帧\"; is(value, \"data.frame\") is not TRUE")"

是否可以使用空间数据运行 foreach 循环?我不担心最后重新加入数据,因为我可以稍后单独执行。

【问题讨论】:

    标签: r dataframe parallel-processing spatial


    【解决方案1】:

    当我有一些空间数据框时,我发现了这个问题,我使用了 dplyr 函数,例如:

    sp1@data <- bind_cols(sp1@data, new_col)
    

    我相信 dplyr 将空间数据帧 (sp1@data) 转换为 tbl_df。为了解决这个问题,我所要做的就是:

    sp1@data <- as.data.frame(bind_cols(sp1@data, new_col))
    

    简而言之,您只需确保所有@data 都是正确的数据帧,而不是tbl_df。

    【讨论】:

      猜你喜欢
      • 2019-11-18
      • 1970-01-01
      • 2015-10-16
      • 2016-01-26
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      相关资源
      最近更新 更多