R foreach与.combine = rbindlist

时间:2013-07-01 18:28:32

标签: r data.table

我正在使用带有.combine = rbindlist的foreach。这似乎不起作用,但如果我使用.combine = rbind。

它可以正常工作

仅使用一个简单的例子来说明 -

> t2 <- data.table(col1=c(1,2,3))
> foreach (i=1:3, .combine=rbind) %dopar% unique(t2)
   col1
1:    1
2:    2
3:    3
4:    1
5:    2
6:    3
7:    1
8:    2
9:    3

# But using rbindlist gives an error

> foreach (i=1:3, .combine=rbindlist) %dopar% unique(t2)
error calling combine function:
<simpleError in fun(result.1, result.2): unused argument(s) (result.2)>
NULL

有没有人能够做到这一点?

提前致谢。

2 个答案:

答案 0 :(得分:19)

这基本上就是你所说的 - rbindlist假设一个list参数,而你得到的错误与此错误相同:

result.1 = data.table(blah = 23)
result.2 = data.table(blah = 34)

rbindlist(result.1, result.2)
#Error in rbindlist(result.1, result.2) : unused argument (result.2)

如果您想使用rbindlist,可以这样做:

rbindlist(foreach (i = 1:3) %dopar% unique(t2))

或者这个:

foreach (i=1:3, .combine=function(x,y)rbindlist(list(x,y))) %dopar% unique(t2)

答案 1 :(得分:11)

以下是使用rbindlist作为.combine函数并拥有.multicombine=TRUE 的方法:

foreach (i=1:3,
         .combine=function(...) rbindlist(list(...)),
         .multicombine=TRUE) %dopar% unique(t2)

如果你有一个相当数量的单独结果来聚合,这可能比仅一次两个组合快得多。

对于单个foreach语句,这会产生与让foreach默认.combine列出并使用rbindlist包装相同的结果,就像在eddi的第一个解决方案中一样。我不确定哪个更快,但我希望它们接近。

对于小型,单foreach个工作,我喜欢用rbindlist包装,但是当与foreach一起链接多个%:%时,我认为上述方法(可能在第一个foreach)看起来更干净。