16

我正在使用带有 .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

有没有人能够完成这项工作?

提前致谢。

4

2 回答 2

22

这基本上就是你所说的 -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)
于 2013-07-01T19:06:40.813 回答
14

这是一种既可以使用 rbindlist 作为.combine函数又可以.multicombine=TRUE使用的方法:

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

如果您有大量单独的结果要汇总,这可能比一次仅合并两个结果要快得多。

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

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

于 2013-09-24T23:05:13.937 回答