我正在使用带有.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
有没有人能够做到这一点?
提前致谢。
答案 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
)看起来更干净。