5

让我在 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 嵌套在该函数 2 中,因为这会导致 func1 被多次定义(func2 用于类似循环的结构中)。

我已经尝试简化代码以摆脱双循环,但由于问题的性质,这是完全不可能的。有任何想法吗?

4

2 回答 2

4

我想你想要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-04T14:49:53.227 回答
2

我认为您现在将范围界定与并行计算混淆了。您正在调用新的 R 会话——通常您有责任在节点上重新创建您的环境。

另一种方法是使用 foreach 等。在 foreach (或 iterator ?)文档中有一些例子可以准确地说明这一点。哦,看,乔希现在已经推荐了同样的东西。

于 2010-10-04T14:52:35.140 回答