使用foreach循环并使用r中的函数进行组合

时间:2015-01-29 06:54:54

标签: r parallel-foreach

我正在阅读r中foreach包的文档,并且能够理解.combinecrbindcbind的处理方式。但是文档说如果要使用此函数进行组合,还可以将函数的名称传递给语句中的.combine。在尝试访问我在此功能中合并的每个foreach中的各个元素时,我无法理解输出。 (我将此函数称为mycombinefunc

这是我尝试过的。我不明白为什么输出在foreach语句的输出中打印两次。

> mycombinefunc= function(...){mylist = list(...);print(mylist)}

> foreach(i=1:2, .combine='mycombinefunc') %do% {c(1:5)}
[[1]]
[1] 1 2 3 4 5

[[2]]
[1] 1 2 3 4 5

[[1]]
[1] 1 2 3 4 5

[[2]]
[1] 1 2 3 4 5

#just calling the function directly to show what the expected output for one iteration of the foreach loop looks like. I would have expected that the above function call would produce two copies of the below output
> mycombinefunc(c(1:5))
[[1]]
[1] 1 2 3 4 5

1 个答案:

答案 0 :(得分:2)

运行combine函数以将新结果合并到先前的结果。在您的示例中,您将看到输出两次,因为您在combine函数中明确地有一个print()语句,因此您可以看到传递给combine函数的两个向量。然后,从foreach()返回此值,默认情况下,R会将该函数的结果打印到控制台。

您应该期望combine收到两个值。一个来自上一次迭代和当前迭代。所以真正被称之为

mycombinefunc(1:5, 1:5)

并且您希望将其“合并”为一个结果。这与R中Reduce()函数的工作方式非常相似。也许请查看?Reduce帮助页面以获取更多信息。

假设您想要一个组合函数,只需将向量相加,就可以

mycombinefunc= function(a,b){a+b}
foreach(i=1:3, .combine='mycombinefunc') %do% {c(1:5)} 
# [1]  3  6  9 12 15

请注意我们如何从foreach()返回一个结果。我们没有看到任何中间值,因为我们从combine函数中删除了print()。此外,我们得到一个向量而不是列表,因为我们选择将元素添加到一起而不是附加到列表中。