在R问题中做并行

时间:2016-10-03 14:49:36

标签: r parallel-processing

我正在尝试修改包含0,1,2值的大矩阵并将2替换为1。 矩阵包含500.000列和7000行。数据已经被50行读入,现在我想使用foreach()%dopar%在块和多线程中分解它。

> SNPchunk
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,]    0    0    0    0    1    0    0    2    
[2,]    1    0    1    0    1    1    1    0    
[3,]    1    0    1    0    1    1    0    1   
[4,]    0    0    0    0    1    0    0    2    
[5,]    0    0    0    0    2    0    2    1    
[6,]    0    0    0    0    0    0    0    1   
[7,]    0    0    0    0    1    0    0    2  
[8,]    0    0    0    0    2    0    1    1   
[9,]    1    1    1    0    1    1    0    1   
[10,]   0    0    0    0    1    0    1    1    
chunk = foreach (part = 1:snpsplit) %do% 
{
    snpchunk = SNPcomponents[,snp.start[part]:snp.stop[part]]

    #print(part)

    res = foreach(SNP=1:ncol(snpchunk), .combine='cbind') %dopar% 
    {
        a = snpchunk[,SNP]
        a[a==2] <- 1
        print(a)
    }           
}   

使用print(a)语句,返回的变量 res 是一个n乘x的矩阵,所有2都替换为1。

       result.1 result.2 result.3 result.4 result.5 result.6 result.7 result.8
[1,]        0        1        1        1        0        1        1        1
[2,]        0        0        0        0        0        0        0        0
[3,]        1        0        0        0        0        0        0        0
[4,]        0        0        0        0        0        0        1        1
[5,]        0        1        1        1        0        0        1        1
[6,]        1        0        1        1        0        1        1        1
[7,]        0        1        1        1        0        0        1        1
[8,]        0        1        0        0        1        1        1        1
[9,]        0        0        0        0        0        0        0        0
[10,]       1        1        0        0        0        0        0        1

但是如果没有print(a)语句,返回的变量 res 是一个1 x的矩阵,只包含值1.

>res
result.1 result.2 result.3 result.4 result.5 result.6 result.7 result.8
   1        1        1        1        1        1        1        1 

如何在不使用print语句的情况下获得第一个结果?

感谢您的帮助! 学家

1 个答案:

答案 0 :(得分:0)

如果您完全删除print(a) a[a==2] <- 1行返回1.这就是您应该使用a代替print(a)

的原因
res = foreach(SNP=1:ncol(snpchunk), .combine='cbind') %dopar% 
{
    a = snpchunk[,SNP]
    a[a==2] <- 1
    a
}