让我在R中添加另一个作用域问题,这次是降雪包。如果我在全局环境中定义了一个函数,并在稍后尝试在另一个函数的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被用在一个类似循环的结构中)。
我已经尝试过简化代码以消除双循环,但由于问题的性质,这是不可能的。有什么想法吗?
发布于 2010-10-04 22:49:53
我认为你想要sfExport(func1),尽管我不确定你需要在你的.GlobalEnv中还是在func2中这样做。希望这能帮上忙。
> 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-04 22:52:35
我认为你现在混淆了作用域和并行计算。您正在调用新的R会话-通常由您负责在节点上重新创建您的环境。
另一种选择是使用foreach等人。foreach (或迭代器?)中有示例。文档中显示的正是这一点。看吧,乔什现在也推荐了同样的东西。
https://stackoverflow.com/questions/3856245
复制相似问题