1

我正在阅读foreachr 中包的文档,并且能够理解如何.combinec,rbindcbind. 但是文档说,.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
4

1 回答 1

2

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

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

mycombinefunc(1:5, 1:5)

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

假设您想要一个仅将向量相加的组合函数,您可以这样做

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

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

于 2015-01-29T07:06:33.130 回答