gpt4 book ai didi

r - 在 R : Error in do. ply(i) 中使用并行 plyr 和 data.table 时出错:任务 1 失败 - "invalid subscript type ' 列表'"

转载 作者:行者123 更新时间:2023-12-02 00:54:02 24 4
gpt4 key购买 nike

我尝试使用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但没有得到答案

有什么建议吗?

最佳答案

只需很少量的额外工作,您就可以使用 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 添加到包装 list :

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

关于r - 在 R : Error in do. ply(i) 中使用并行 plyr 和 data.table 时出错:任务 1 失败 - "invalid subscript type ' 列表'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23759351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com