これは私が理解するのが難しいと思うものです:
cl = makeCluster(rep("localhost", 8), "SOCK")
# This will not work, error: dat not found in the nodes
pmult = function(cl, a, x)
{
mult = function(s) s*x
parLapply(cl, a, mult)
}
scalars = 1:4
dat = rnorm(4)
pmult(cl, scalars, dat)
# This will work
pmult = function(cl, a, x)
{
x
mult = function(s) s*x
parLapply(cl, a, mult)
}
scalars = 1:4
dat = rnorm(4)
pmult(cl, scalars, dat)
# This will work
pmult = function(cl, a, x)
{
mult = function(s, x) s*x
parLapply(cl, a, mult, x)
}
scalars = 1:4
dat = rnorm(4)
pmult(cl, scalars, dat)
引数の遅延評価のため、最初の関数は機能しません。しかし、遅延評価とは何ですか? mult() が実行されるとき、x を評価する必要はありませんか? 2 番目の方法は、x を強制的に評価するため機能します。ここで、最も奇妙なことが 3 番目の関数で発生します。mult() が追加の引数として x を受け取るようにするだけで、突然すべてが機能します!
もう 1 つのことは、parLapply() を呼び出す関数内ですべての変数と関数を定義したくない場合はどうすればよいでしょうか? 以下は間違いなく機能しません。
pmult = function(cl)
{
source("a_x_mult.r")
parLapply(cl, a, mult, x)
}
scalars = 1:4
dat = rnorm(4)
pmult(cl, scalars, dat)
これらすべての変数と関数を引数として渡すことができます。
f1 = function(i)
{
return(rnorm(i))
}
f2 = function(y)
{
return(f1(y)^2)
}
f3 = function(v)
{
return(v- floor(v) + 100)
}
test = function(cl, f1, f2, f3)
{
x = f2(15)
parLapply(cl, x, f3)
}
test(cl, f1, f2, f3)
または、clusterExport() を使用することもできますが、エクスポートするオブジェクトが多数ある場合は面倒です。より良い方法はありますか?