R foreach与.combine = rbindlist

xbs*_*bsd 15 r data.table

我使用foreach和.combine = rbindlist.这似乎不起作用,但如果我使用.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
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

edd*_*ddi 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)
Run Code Online (Sandbox Code Playgroud)

如果你想利用rbindlist,那么这样做的方法是:

rbindlist(foreach (i = 1:3) %dopar% unique(t2))
Run Code Online (Sandbox Code Playgroud)

或这个:

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


Cla*_*nJY 11

这是一种使用rbindlist作为.combine函数的方法,并具有.multicombine=TRUE:

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

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

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

对于foreach我喜欢包装的小型单一作业rbindlist,但是当我将几个链接foreach在一起时,%:%我认为上述方法(可能在第一个方面foreach)看起来更清晰.

  • 这种组合功能适用于并行后端,可以即时调用组合功能.这允许主人与工人并行地进行后处理.当组合功能执行减少时,它甚至更有用. (3认同)
  • 你也可以直接使用`rbindlist`作为".final"函数和默认的组合函数,因为它产生一个列表.这是一个非常干净的解决方案,但我会使用你的组合功能. (3认同)