Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取通过foreach计算的值的平均值_R_Foreach - Fatal编程技术网

获取通过foreach计算的值的平均值

获取通过foreach计算的值的平均值,r,foreach,R,Foreach,假设您有一组计算,您希望使用这些计算来执行。也许您现在或将来想要将它们并行化。每次计算都返回一个数字。用这种方式计算出的所有数字的平均值,最好的习惯用法是什么 我想到了两个解决方案,我将尽可能地发布答案,以便您可以对这些答案进行单独投票和评论,甚至可以编辑它们以改进它们。但我想可能有更好的方法,所以欢迎更多的答案。我的答案将包括一些示例,您可以采用这些示例来演示自己的技术。一个解决方案将结果累积到一个向量中,并最终在该向量上执行mean函数 > foreach(i = icount(300

假设您有一组计算,您希望使用这些计算来执行。也许您现在或将来想要将它们并行化。每次计算都返回一个数字。用这种方式计算出的所有数字的平均值,最好的习惯用法是什么


我想到了两个解决方案,我将尽可能地发布答案,以便您可以对这些答案进行单独投票和评论,甚至可以编辑它们以改进它们。但我想可能有更好的方法,所以欢迎更多的答案。我的答案将包括一些示例,您可以采用这些示例来演示自己的技术。

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

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

  • 也可用于嵌套的
    foreach
    调用
  • 也适用于除
    mean
    之外的聚合函数
  • 不需要了解迭代中的值的数量
缺点:

  • 首先将所有结果收集到一个向量中,这可能会消耗不必要的内存,尤其是在执行大量非常小的作业时

一个解决方案将结果累加为一个和,并最终将该和除以迭代次数

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

  • 对于单个数字和,只需要内存,这应该是一个性能增益
  • 也可用于嵌套的
    foreach
    调用
缺点:

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

抱歉,这与您的主要问答没有直接关系。在大量的小作业上,并行代码将如何工作?我怀疑会涉及大量开销,严重限制了并行计算的优势。@RomanLuštrik,我不确定这是否真的适用于所有后端,但理论上foreach应该尝试将作业组合在一起,使每个工作人员在返回任何内容之前执行多个作业。如果这是可行的,那么大量具有单个数字结果的小作业可能会像具有多个数字结果的较小数量的较大作业一样工作。但foreach本身对此没有任何保证。