1

各呼び出しが関数の親環境を変更する、繰り返される独立した関数呼び出しを並列化する方法を見つけたいと思います。関数の各実行は独立していますが、さまざまな理由から、関数の親環境の変更に依存しない他の実装を検討することができません。以下の簡単な例を参照してください。親環境のコピーを各ノードに渡す方法はありますか? これをLinuxシステムで実行しています。

 create_fun <- function(){

        helper <- function(x, params) {x+params}
        helper2 <- function(z) {z+helper(z)}

        master <- function(y, a){
            parent <- parent.env(environment())
            formals(parent[['helper']])$params <- a
            helper2(y)}

       return(master)
}

# function to be called repeatedly
master <- create_fun()

# data to be iterated over
x <- expand.grid(1:100, 1:5)

# vector where output should be stored
results <- vector("numeric", nrow(x))

# task I'd like to parallelize
for(i in 1:nrow(x)){
    results[i] <- master(x[i,1], x[i, 2])
}
4

1 に答える 1

1

関数は、親環境への参照を維持します。masterの環境( で作成された環境create_fun)の内容を見ることができます

ls (environment(master) )
# [1] "helper"  "helper2" "master" 

%dopar%あなたができることを使用して

## Globals
master <- create_fun()
x <- expand.grid(1:100, 1:5)

## Previous results
for(i in 1:nrow(x)){
    results[i] <- master(x[i,1], x[i, 2])
}

library(parallel)
library(doParallel)
cl <- makePSOCKcluster(4)
registerDoParallel(cl)

## parallel
res <- foreach(i=1:nrow(x), .combine = c) %dopar% {
    master(x[i,1], x[i,2])
}

all.equal(res, results)
# TRUE
于 2015-07-01T01:49:42.260 に答える