这是我觉得很难理解的一点:
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 吗?第二个有效,因为它强制 x 被评估。现在最奇怪的事情发生在第三个函数中,除了让 mult() 接收 x 作为一个额外的参数之外什么也没做,突然一切都正常了!
另一件事是,如果我不想在调用 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(),但是当有很多对象要导出时会很麻烦。有没有更好的办法?