2

假设你有一堆计算,你想使用foreach. 也许您想在现在或将来并行化它们。每个计算都返回一个数字。获得以这种方式计算的所有数字的平均值的最佳习语是什么?

我想到了两个解决方案,我会将它们作为可能的答案发布,以便您可以单独对它们进行投票和评论,甚至可以对其进行编辑以改进它们。但我想可能有更好的方法,所以欢迎补充答案。我的答案将包括您可以用来展示您自己的技术的示例。

4

2 回答 2

0

一种解决方案将结果累积成一个总和,并最终将该总和除以迭代次数。

> foreach(i = icount(300), .combine = '+', .inorder = FALSE,
+         .final = function(x) x/300) %do% { i*7 %% 11 }
[1] 1053.5

好处:

  • 只需要单个数字总和的内存,这应该是性能提升
  • 也适用于嵌套foreach调用

缺点:

  • 迭代次数必须在 的参数列表中重复foreach。在这个例子中,数字是一个常数,所以这很容易,并且使用单个变量甚至单个向量的长度应该不会更难。但是在迭代跨越多个向量或未知大小的迭代器的情况下,事情可能会变得更加困难,并且由于不一致的修改导致的错误可能会被忽视。
于 2012-12-06T13:56:18.850 回答
0

一种解决方案将结果累积在一个向量中,并最终在该向量mean上执行函数。

> foreach(i = icount(300), .combine = c, .inorder = FALSE, .multicombine = TRUE,
+         .final = mean) %do% { i*7 %% 11 }
[1] 1053.5

好处:

  • 也适用于嵌套foreach调用
  • 也可与聚合函数一起mean使用
  • 不需要任何关于迭代中值的数量的知识

缺点:

  • 首先将所有结果收集到一个向量中,这可能会消耗不必要的内存,尤其是在执行大量非常小的作业时。
于 2012-12-06T13:51:39.530 回答