выполнить параллель в R-проблеме

#r #parallel-processing

#r #параллельная обработка

Вопрос:

Я пытаюсь изменить большую матрицу, содержащую значения 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?

Спасибо за помощь! J.

Ответ №1:

Если вы полностью удалите 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
}