21

foreach を使用して、R でマルチコア コンピューティングを実行しようとしています。

A <-function(....) {
    foreach(i=1:10) %dopar% {
    B()
    }
}

A次に、コンソールで関数を呼び出します。問題は、ソースの別のスクリプト ファイルで定義されている関数Posdefを内部で呼び出していることです。:の export 引数のリストBに入れる必要がありました。ただし、次のエラーが表示されます。Posdefforeach.export=c("Posdef")

Error in { : task 3 failed - "could not find function "Posdef""

なぜRはこの定義された関数を見つけられないのですか?

4

3 に答える 3

16

好奇心旺盛な人のために、これを再現できます:

require(doSNOW)
registerDoSNOW(makeCluster(5, type="SOCK"))
getDoParWorkers()
getDoParName()
getDoParVersion()

fib <- function(n) {
  if (n <= 1) { return(1) }
  return(fib(n-1) + fib(n-2))
}

my.matrix <- matrix(runif(2500, 10, 50), nrow=50)

calcLotsaFibs <- function() {
  result <- foreach(row.num=1:nrow(my.matrix), .export=c("fib", "my.matrix")) %dopar% {
    return(Vectorize(fib)(my.matrix[row.num,]))
  }
  return(result)
}

lotsa.fibs <- calcLotsaFibs()

関数を別のファイルに入れ、そのファイルを foreach の本体にロードすることで、これを回避できました。関数定義を foreach 自体の本体に移動することもできます。

[編集 -- .export が関数名で適切に動作しない可能性があることを以前に示唆していましたが、以下に修正されました。]

于 2012-04-11T21:21:54.430 に答える