2012-12-14 60 views
1

运行sfLapply我的一段代码看起来像:错误中的R

x<- c(1,2,3,4,5) 

library(snowfall) 

f1<- function(a,list){ 
    f2<-function(b,num){ return(abs(num-b))} 

    l1<-sfLapply(list, f2, num=a) 
    l1<-sum(unlist(l1)) 
    return(l1) 
} 

sfInit(parallel=TRUE,cpus=4) 
l2<-(sfLapply(x, f1, list=x)) 
sfStop() 
l2 

当我运行最后四行,它给出了一个错误:

l2<-(sfLapply(x, f1, list=x)) 
Error in checkForRemoteErrors(val) : 
    4 nodes produced errors; first error: could not find function "sfLapply" 

。当切换到顺序处理,使用lapply,它完美运行。

> l2<-(lapply(x, f1, list=x)) 
> l2 
[[1]] 
[1] 10 

[[2]] 
[1] 7 

[[3]] 
[1] 6 

[[4]] 
[1] 7 

[[5]] 
[1] 10 

为什么sfLapply会抛出一个错误?

回答

3

您需要在群集节点上加载snowfall软件包。因此插入

sfLibrary(snowfall) 

sfInit()


编辑:对于澄清:

你的功能f1包含函数sfLapply,这是在snowfall包中找到。如上所述使用sfInit初始化群集时,snow程序包将加载到群集的每个节点上,而不是snowfall程序包。如果没有后者,节点上就没有任何对象(功能或其他方面),称为sfLapply,并且会出现错误。

+0

谢谢!你能否也解释一下这方面的工作?我以前用过多个核心的sfLapply,但从来没有得到这个错误。 – jackStinger

+0

@jackStinger,编辑是否足以说明事情?你可以用'lapply'替换'f1'函数中的'sfLapply'吗? – BenBarnes

+0

啊。这清除了我的怀疑!谢谢! – jackStinger