使用并行应用后如何保留数据框形式的列表
How to preserve the list of data frame form after using parallel apply
我有以下函数my_func
,它将参数存储在数据帧params
中,并独立地将一个额外的参数作为另一个dfindf
library(tidyverse)
my_func <- function (x=NULL,y=NULL,z=NULL, indf=NULL) {
out <- (x * y *z )
out * indf
}
params <- tribble(
~x, ~y, ~z,
5, 1, 1,
10, 5, 3,
-3, 10, 5
)
indf <- tribble(
~A, ~B, ~C,
100, 10, 1,
1000, 300, 3,
20, 10, 5
)
params %>%
pmap(my_func, indf=indf)
它产生以下数据帧列表:
#> [[1]]
#> A B C
#> 1 500 50 5
#> 2 5000 1500 15
#> 3 100 50 25
#>
#> [[2]]
#> A B C
#> 1 15000 1500 150
#> 2 150000 45000 450
#> 3 3000 1500 750
#>
#> [[3]]
#> A B C
#> 1 -15000 -1500 -150
#> 2 -150000 -45000 -450
#> 3 -3000 -1500 -750
然后我想做的是 运行 上面的函数 parallel package. I did it this :
library(parallel)
params %>%
lift(mcmapply, mc.cores = detectCores() - 1)(FUN = my_func, indf=indf)
但它会生成以下矩阵。
[,1] [,2] [,3]
[1,] 500 1500 -150
[2,] 5000 45000 -450
[3,] 100 1500 -750
我如何使用 parallel 来生成像初始输出一样的数据帧列表?
library(parallel)
nc <- max(detectCores() - 1, 1L)
params %>%
lift(mcmapply, SIMPLIFY = FALSE, mc.cores = nc)(FUN = my_func, MoreArgs = list(indf = indf))
# [[1]]
# A B C
# 1 500 50 5
# 2 5000 1500 15
# 3 100 50 25
#
# [[2]]
# A B C
# 1 15000 1500 150
# 2 150000 45000 450
# 3 3000 1500 750
#
# [[3]]
# A B C
# 1 -15000 -1500 -150
# 2 -150000 -45000 -450
# 3 -3000 -1500 -750
编辑
这里有一个 "cleaner" 选项,应该更像是使用 pmap
:
nc <- max(parallel::detectCores() - 1, 1L)
par_pmap <- function(.l, .f, ..., mc.cores = getOption("mc.cores", 2L)) {
do.call(
parallel::mcmapply,
c(.l, list(FUN = .f, MoreArgs = list(...), SIMPLIFY = FALSE, mc.cores = mc.cores))
)
}
library(magrittr)
params %>%
par_pmap(my_func, indf = indf, mc.cores = nc)
# [[1]]
# A B C
# 1 500 50 5
# 2 5000 1500 15
# 3 100 50 25
#
# [[2]]
# A B C
# 1 15000 1500 150
# 2 150000 45000 450
# 3 3000 1500 750
#
# [[3]]
# A B C
# 1 -15000 -1500 -150
# 2 -150000 -45000 -450
# 3 -3000 -1500 -750
我有以下函数my_func
,它将参数存储在数据帧params
中,并独立地将一个额外的参数作为另一个dfindf
library(tidyverse)
my_func <- function (x=NULL,y=NULL,z=NULL, indf=NULL) {
out <- (x * y *z )
out * indf
}
params <- tribble(
~x, ~y, ~z,
5, 1, 1,
10, 5, 3,
-3, 10, 5
)
indf <- tribble(
~A, ~B, ~C,
100, 10, 1,
1000, 300, 3,
20, 10, 5
)
params %>%
pmap(my_func, indf=indf)
它产生以下数据帧列表:
#> [[1]]
#> A B C
#> 1 500 50 5
#> 2 5000 1500 15
#> 3 100 50 25
#>
#> [[2]]
#> A B C
#> 1 15000 1500 150
#> 2 150000 45000 450
#> 3 3000 1500 750
#>
#> [[3]]
#> A B C
#> 1 -15000 -1500 -150
#> 2 -150000 -45000 -450
#> 3 -3000 -1500 -750
然后我想做的是 运行 上面的函数 parallel package. I did it this
library(parallel)
params %>%
lift(mcmapply, mc.cores = detectCores() - 1)(FUN = my_func, indf=indf)
但它会生成以下矩阵。
[,1] [,2] [,3]
[1,] 500 1500 -150
[2,] 5000 45000 -450
[3,] 100 1500 -750
我如何使用 parallel 来生成像初始输出一样的数据帧列表?
library(parallel)
nc <- max(detectCores() - 1, 1L)
params %>%
lift(mcmapply, SIMPLIFY = FALSE, mc.cores = nc)(FUN = my_func, MoreArgs = list(indf = indf))
# [[1]]
# A B C
# 1 500 50 5
# 2 5000 1500 15
# 3 100 50 25
#
# [[2]]
# A B C
# 1 15000 1500 150
# 2 150000 45000 450
# 3 3000 1500 750
#
# [[3]]
# A B C
# 1 -15000 -1500 -150
# 2 -150000 -45000 -450
# 3 -3000 -1500 -750
编辑
这里有一个 "cleaner" 选项,应该更像是使用 pmap
:
nc <- max(parallel::detectCores() - 1, 1L)
par_pmap <- function(.l, .f, ..., mc.cores = getOption("mc.cores", 2L)) {
do.call(
parallel::mcmapply,
c(.l, list(FUN = .f, MoreArgs = list(...), SIMPLIFY = FALSE, mc.cores = mc.cores))
)
}
library(magrittr)
params %>%
par_pmap(my_func, indf = indf, mc.cores = nc)
# [[1]]
# A B C
# 1 500 50 5
# 2 5000 1500 15
# 3 100 50 25
#
# [[2]]
# A B C
# 1 15000 1500 150
# 2 150000 45000 450
# 3 3000 1500 750
#
# [[3]]
# A B C
# 1 -15000 -1500 -150
# 2 -150000 -45000 -450
# 3 -3000 -1500 -750