2017-12-04 1 views
1

I haben folgende Funktion my_func, die Parameter in einem Datenrahmen params und nehmen eine zusätzliche param als ein anderer df unabhängig indfwie die Liste von Datenrahmenform zu bewahren, nachdem parallel unter Verwendung gelten


gespeichert dauert
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) 

Es produziert die folgende Liste von Datenrahmen:

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

Was ich dann tun möchte, ist die obige Funktion mit parallel Paket auszuführen. Ich habe es dieses way:

library(parallel) 
params %>% 
    lift(mcmapply, mc.cores = detectCores() - 1)(FUN = my_func, indf=indf) 

Aber es ergibt sich folgende Matrix statt.

Wie kann ich parallel verwenden, so dass es eine Liste von Datenrahmen wie die ursprüngliche Ausgabe erzeugt?

Antwort

3
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 

bearbeiten

Hier ist ein "sauberer" Option, dass pmap wie mit fühlen sollte:

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 
Verwandte Themen