gpt4 book ai didi

r - 使用并行应用后如何保留数据框形式的列表

转载 作者:行者123 更新时间:2023-12-04 03:02:49 25 4
gpt4 key购买 nike

我有以下函数 my_func,它接受存储在数据帧 params 中的参数,并独立地将一个额外的参数作为另一个 df indf


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 运行上面的函数包裹。我这样做了way :

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

编辑

这是一个“更干净”的选项,感觉更像是使用 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

关于r - 使用并行应用后如何保留数据框形式的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com