在R中使用并行plyr和data.table时出错:do.ply(i)中的错误:任务1失败 - “无效的下标类型'列表'”

时间:2014-05-20 12:05:12

标签: r foreach parallel-processing data.table plyr

我正在尝试使用data.table包和plyr在R中进行一些并行计算,我会遇到意外行为。我正在使用Windows 7.

我创建了以下函数,使用data.table

生成频率表
 t_dt_test <- function(x){ 
    #creates a 1-d frequency table for x
    dt <- data.table(x)
    dt[, j = list(freq = .N), by = x] 
}

创建一些测试数据

 test <- list(letters[1:3],letters[1:3],letters[1:3])

使用llply

.parallel = FALSE可以正常使用
 llply(test, t_dt_test, .parallel = FALSE)
     [[1]]
   x freq
1: a    1
2: b    1
3: c    1

如果我尝试平行购买

library(doParallel)
nodes <- detectCores()
cl <-makeCluster(nodes)


llply(test, t_dt_test, .parallel = TRUE ,.paropts = list( .packages = 'data.table'))

返回此

Error in do.ply(i) : task 1 failed - "invalid subscript type 'list'"

似乎[.data.table没有像我期望的那样传递给节点。

我尝试将功能更改为

 t_dt_test <- function(x){ 
        #creates a 1-d frequency table for x
        dt <- data.table(x)
        data.table:::`[.data.table`(x = dt,  j = list(freq = .N), by = x)
    }

但仍然会出现同样的错误。

此处提出了类似的问题:Strange environment behavior in parallel plyr但没有得到答案

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

只需要进行非常少量的额外工作,您就可以使用foreach包对其进行并列化。

试试这个:

library(data.table)

t_dt_test <- function(x){ 
  dt <- data.table(x)
  dt[, j = list(freq = .N), by = x] 
}

test <- list(letters[1:3],letters[1:3],letters[1:3])

首先在顺序计算模式下使用foreach(),以确保您具有正确的语法。由于foreach()循环负责拆分和合并,因此不再使用llply()

library(foreach)
foreach(i = seq_along(test), .combine = c) %do% {
  list(
    t_dt_test(test[[i]])
  )
}

要同时运行此功能,您只需将%do%更改为%dopar,并记住将data.table添加到包列表中:

library(doParallel)
registerDoParallel(detectCores())
foreach(i = seq_along(test), .combine = c, .packages = "data.table") %dopar% {
  list(
    t_dt_test(test[[i]])
  )
}

结果如预期:

[[1]]
   x freq
1: a    1
2: b    1
3: c    1

[[2]]
   x freq
1: a    1
2: b    1
3: c    1

[[3]]
   x freq
1: a    1
2: b    1
3: c    1