Преобразуйте lapply в foreach с помощью %допара%

#r #foreach

Вопрос:

Я просматриваю список, в котором я выбираю элементы списка.

 [[1]] LRPAP1  ITGB1  TIMP1    TNC   CD81   CKLF   BST2  HLA-C  PDAP1  CALM3   NPTN 
    95    188    155    158    226     27    179     66    113     19    321
   ITGA3  TIMP2    FN1   AGR2    CD9  CALM1   RTN4
   193    156   58    306    191     17    135 

[[2]]    GSTP1      BSG      VIM LGALS3BP    UBA52      APP     ARF1   HMGB1 
      62      178      168       92      159       10       12       68 
    CALR     PSAP     CAV1  HSP90B1    LTBP3   PRSS23     CD63    APLP2 
      20      125      209       71       96      124      338      289 
    CANX 
     290 

[[3]]
     PKM     PTMA    HLA-B      MDK    HSPA8   RPS27A      UBB     P4HB 
     117      128       65       99       73      134      160      112     CALM2 
     HSP90AA1    ANXA1     RPSA    HLA-A      B2M      UBC    GNAS 
      18       70        7      257       64       14      161       60     RPS19   
     LGALS1 
     133       91
 

пинд-это список списков.Следующий код работает, но мне нужно изменить эту строку для целей упаковки …(Биокондуктор в R)

 test <- lapply(pind,function(x) sample(x,length(x)))
 

Я пытаюсь сделать что-то подобное, но безуспешно :

   test<- foreach::foreach(k = seq_len(length(pind)),.combine = 'c') %dopar% {
     sample(k,length(k))
  }
 

Ответ №1:

Примеры данных:

 ll <- list(1:100, runif(100,1,100), runif(100,1,100))
str(ll)
#> List of 3
#>  $ : int [1:100] 1 2 3 4 5 6 7 8 9 10 ...
#>  $ : num [1:100] 70.67 66.75 68.86 2.43 81.77 ...
#>  $ : num [1:100] 16.6 69.1 19.3 26 38.9 ...
 

Векторизованная версия:

 a <- lapply(ll, function(x) sample(x,length(x)))
head(a)
#> [[1]]
#>   [1]   3  23  13  64  74   7  58  59  17  11  43  44  50  48  73  81  29  67
#>  [19]  85  63  65  33  69  26   4   9  90  10  49  55  18  37  60  16  38   8
#>  [37]  93  68  56  53  66  28  32  98 100  35  27  51  86  34  91  84  24  36
#> 
#> [[2]]
#>   [1] 26.513604 74.068939 97.832879 28.087427 45.702629 36.197734 73.750857
#>   [8]  4.787503 87.940046 94.818512 23.615396 94.208696 55.958827 44.829987
#>  [15] 33.290580 73.262774 37.659771 80.607355  7.348920 76.873206 48.308093
#> 
#> [[3]]
#>   [1] 28.675232 45.070406 42.649220 70.651547 41.259800 36.507617 33.017604
#>   [8]  7.931346 83.470752 51.315783  2.003685 22.047479 69.158748 10.031177
#>  [15] 91.584292 69.161923 32.277285 81.528899 95.630044 82.938548 75.106667

 

Распараллеленная версия:

 library(doParallel)
#> Loading required package: foreach
#> Loading required package: iterators
#> Loading required package: parallel
ncores <- detectCores()-1
cl <- parallel::makeCluster(ncores)
registerDoParallel(cl)

b <- foreach(k = 1:length(ll), .combine = "c") %dopar% {
  sample(ll[[k]],length(ll[[k]]))
}

stopCluster(cl)

head(b)
#> [1] 33 63 91 26 18 38
Created on 2021-09-28 by the reprex package (v2.0.1)
 

Подробнее о параллельной обработке в R читайте здесь: https://www.r-bloggers.com/2016/07/lets-be-faster-and-more-parallel-in-r-with-doparallel-package/