Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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
如何计算与R并行的运行平均值?_R_Parallel Processing - Fatal编程技术网

如何计算与R并行的运行平均值?

如何计算与R并行的运行平均值?,r,parallel-processing,R,Parallel Processing,我使用的是Windows 8,如果解决方案不需要Linux,我将不胜感激 我的实际问题要复杂得多,但如果这能奏效,我的问题就会解决。由于作业被划分为不同的核心,因此所有“先前”计算在每次迭代中都不可用。以下是我的尝试: library(snow) library(doSNOW) library(foreach) cl <- makeCluster(3, type="SOCK") registerDoSNOW(cl) avg_x <- 0 foo <- foreach(i=1:

我使用的是Windows 8,如果解决方案不需要Linux,我将不胜感激

我的实际问题要复杂得多,但如果这能奏效,我的问题就会解决。由于作业被划分为不同的核心,因此所有“先前”计算在每次迭代中都不可用。以下是我的尝试:

library(snow)
library(doSNOW)
library(foreach)
cl <- makeCluster(3, type="SOCK")
registerDoSNOW(cl)
avg_x <- 0

foo <- foreach(i=1:10, .combine='rbind') %dopar% {
  x <- rnorm(1, 0, 1)
  if (i == 1) avg_x <- x
  if (i > 1) avg_x <- (avg_x*(i-1) + x) / i
  return(list(index=i, 
              x=x, 
              avg_x=avg_x))
}
stopCluster(cl)
foo <- as.data.frame(foo)
foo$real_avg <- cumsum(foo$x)/(1:10)
如果不可能计算每个迭代的运行平均值,那么是否有可能在每3次迭代后计算一次

更新: 我有一个关于如何做到这一点的想法,我认为这将工作,但我似乎无法得到正确的编程。其思想是在foreach中更新data.frame。四分之三的工作人员将生成随机数,另一个将使用以前的迭代计算运行平均数。但我在尝试更新data.frame时出错

library(snow)
library(doSNOW)
library(foreach)

cl <- makeCluster(4, type="SOCK")
registerDoSNOW(cl)

f <- data.frame(x=rep(0,13), 
                ind=rep(0,13), 
                runAvg=rep(0,13))

foreach(i=icount(13), .export='f') %dopar% {
  if (i == 1) return
  if ((i-1)%%4 != 0) {
    #cores 2, 3, 4 just get populated with the random numbers
    f[i,] <- c(rnorm(1, 0, 1), i, 0)
  }
  if ((i-1)%%4 == 0){
    #core 1 only calculates the running average
    f[i,] <- (f[i-4,3]*(i - 4 - (i+3)/4)) + (f[i-3,1] + f[i-2,1] + f[i-1,1])/(i - (i+3/4))
  }
}
stopCluster(cl)
f

我看不出运行平均值是如何平行的:对于索引
I
,它取决于
x[I]
av[I-1]
。你知道怎么可能吗?@tonytonov我刚刚更新了这个问题,我想知道怎么做。你想要的结果是什么?只是一个
data.table
,上面有所有行的逐行累积平均值?如果是这样的话,你可以事后计算。不能让每个并行进程在其父环境中编辑对象。最终会出现冲突-一个进程可能会结束,而另一个进程锁定了对象,因为它已经在编辑全局变量,从而阻止了第二个进程。无论如何,要在
foreach
函数调用中对结果进行后处理,请使用
.final
参数。
library(snow)
library(doSNOW)
library(foreach)

cl <- makeCluster(4, type="SOCK")
registerDoSNOW(cl)

f <- data.frame(x=rep(0,13), 
                ind=rep(0,13), 
                runAvg=rep(0,13))

foreach(i=icount(13), .export='f') %dopar% {
  if (i == 1) return
  if ((i-1)%%4 != 0) {
    #cores 2, 3, 4 just get populated with the random numbers
    f[i,] <- c(rnorm(1, 0, 1), i, 0)
  }
  if ((i-1)%%4 == 0){
    #core 1 only calculates the running average
    f[i,] <- (f[i-4,3]*(i - 4 - (i+3)/4)) + (f[i-3,1] + f[i-2,1] + f[i-1,1])/(i - (i+3/4))
  }
}
stopCluster(cl)
f
Error in { : task 1 failed - "replacement has 0 items, need 3"
In addition: Warning message:
In e$fun(obj, substitute(ex), parent.frame(), e$data) :
  already exporting variable(s): f