【发布时间】:2017-10-19 20:40:58
【问题描述】:
我有一个包含循环的函数
myfun = function(z1.d, r, rs){
x = z1.d[,r]
or.d = order(as.vector(x), decreasing=TRUE)[rs]
zz1.d = as.vector(x)
r.l = zz1.d[or.d]
y=vector()
for (i in 1:9)
{
if(i<9) y[i]=mean( x[(x[,r] >= r.l[i] & x[,r] < r.l[i+1]),r] ) else{
y[i] = mean( z1.d[(x >= r.l[9]),r] )}
}
return(y)
}
rs 是数值向量,z1.d 是动物园,y 也是数值向量。
当我尝试在并行循环中运行函数时:
cls = makePSOCKcluster(8)
registerDoParallel(cls)
rlarger.d.1 = foreach(r=1:dim(z1.d)[2], .combine = "cbind") %dopar% {
myfun(z1.d, r, rs)}
stopCluster(cls)
我收到以下错误:
Error in { : task 1 failed - "incorrect number of dimensions"
我不知道为什么,但我意识到如果我将循环从我的函数中取出,它不会给出错误。
另外,如果我使用 %do% 而不是 %dopar% 运行完全相同的代码(所以不是并行运行),它工作正常(缓慢但没有错误)。
编辑:这里要求的是参数示例:
dim(z1.d)
[1] 8766 107
> z1.d[1:4,1:6]
AU_10092 AU_10622 AU_12038 AU_12046 AU_13017 AU_14015
1966-01-01 23:00:00 NA NA NA 1.816 0 4.573
1966-01-02 23:00:00 NA NA NA 9.614 0 4.064
1966-01-03 23:00:00 0 NA NA 0.000 0 0.000
1966-01-04 23:00:00 0 NA NA 0.000 0 0.000
> rs
[1] 300 250 200 150 100 75 50 30 10
r 在 foreach 循环中定义
【问题讨论】:
-
参数 z1.d, rs, r 的示例输入会很有帮助。
-
@sbg - 你运行的是什么操作系统。在并行执行的上下文中,这一点很重要。由于 Windows、Linux 和 MacOS 在某些情况下通过 R 公开了不同的并行实现。
-
我在windows中运行它
-
我对@987654325@ 并不完全熟悉,但通常,在使用并行内核时,变量需要“发送”到内核环境。在您的情况下,我看不到您在核心环境中声明
z1.d和rs的位置。正如我所说,我真的不知道foreach,但我会使用它:rlarger.d.1 = foreach(r=1:dim(z1.d)[2], z1.d = z1.d, rs = rs, .combine = "cbind") %dopar% { myfun(z1.d, r, rs)}。顺便说一句,通常像这里的r这样的函数的可变参数应该首先在你的参数函数myfun = function(r, z1.d, rs)中定义。 -
@你是在windows上还是在其他操作系统上?
标签: r foreach doparallel