使用 %doPar% 将 lapply 转换为 foreach

Transform lapply to foreach with %doPar%

我正在浏览一个列表,我正在对列表的元素进行抽样。

[[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

pind 是 list.The 以下代码的列表,但我需要将此行更改为包装目的...(R 中的 Bioconductor)

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

我正在尝试做类似的事情但没有成功:

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

示例数据:

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/