5

R にもう 1 つのスコープの問題を追加します。今回は Snowfall パッケージを使用します。グローバル環境で関数を定義し、後で別の関数内の sfApply() でその関数を使用しようとすると、最初の関数が見つかりません:

#Runnable code. Don't forget to stop the cluster with sfStop()
require(snowfall)
sfInit(parallel=TRUE,cpus=3)

func1 <- function(x){
    y <- x+1
    y
}

func2 <- function(x){
    y <- sfApply(x,2,function(i) func1(i) )
    y
}

y <- matrix(1:10,ncol=2)
func2(y)
sfStop()

これは与える :

> func2(y)
Error in checkForRemoteErrors(val) : 
  2 nodes produced errors; first error: could not find function "func1"

ただし、関数を他の関数内にネストすると、機能します。グローバル環境で sfApply() を使用した場合にも機能します。つまり、関数 func1 をその function2 内にネストしたくありません。これは、func1 が何度も定義される原因となるためです (func2 はループのような構造で使用されます)。

二重ループを取り除くためにコードを単純化しようとしましたが、問題の性質上、それはまったく不可能です。何か案は?

4

2 に答える 2

4

私はあなたがしたいと思いますがsfExport(func1)、あなたがそれをする必要があるかどうかはわかりませ.GlobalEnvfunc2. それが役立つことを願っています...

> y <- matrix(1:10,ncol=2)

> sfExport(list=list("func1"))

> func2(y)
     [,1] [,2]
[1,]    2    7
[2,]    3    8
[3,]    4    9
[4,]    5   10
[5,]    6   11
于 2010-10-04T14:49:53.227 に答える
2

スコープと並列コンピューティングを混同していると思います。新しい R セッションを呼び出しています。通常、ノードで環境を再作成するのはユーザーの責任です。

別の方法は、 foreach などを使用することです。foreach (または iterator ?) ドキュメントには、まさにこれを示す例があります。ああ、ほら、ジョシュは今までに同じことを勧めています。

于 2010-10-04T14:52:35.140 に答える