#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/