R - EasyABC中的并行化。错误:......无法找到功能

时间:2015-06-01 12:18:54

标签: r parallel-processing

我试图在R中并行运行包EasyABC中的ABC_sequential()函数但是我收到了错误:

checkForRemoteErrors(val)出错:   2个节点产生错误;第一个错误:找不到函数“f”

我认为这是因为ABC_sequential()最终调用parLapplyLB()(https://github.com/cran/EasyABC/blob/master/R/EasyABC-internal.R)并且我必须使用clusterExport()导出函数? (parSapply not finding objects in global environment

因为函数调用了makeCluster(),所以我可能需要修改包来添加clusterExport(cl, "f")?但是,由于我是一个相当新的,我没有考虑根据我的需要修改包(我怀疑它可能比添加一行代码更复杂)。我想知道是否有更好/更容易的解决方法将我的功能放到并行节点上?下面是一个简化的可重现示例,它基于ABC帮助中的R帮助中给出的并行示例:

library(EasyABC)

f <- function(x){
    x = x^2     
}

toy_model_parallel <- function(x){ 
set.seed(x[1])
2 * x[2] + f(2) + rnorm(1,0,0.1)
}

sum_stat_obs <- 6.5
pacc <- .4
toy_prior <- list(c("unif",0,1)) # a uniform prior distribution between 0 and 1

# this line of code gives the checkForRemoteErrors(val) error
ABC_Lenormand <- ABC_sequential(method="Lenormand", model=toy_model_parallel, prior=toy_prior, nb_simul=20, summary_stat_target=sum_stat_obs, p_acc_min=pacc, use_seed=TRUE, n_cluster=2)
}

非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

您可以在模型函数中定义任何必要的辅助函数。在这种情况下:

false

看起来你需要在这个函数的开头做任何worker初始化。因此,如果您的函数需要从另一个包中调用函数,那么您还需要在模型函数的开头加载该包。

我建议您向软件包开发人员发送一封电子邮件,看看他们是否有更好的解决方案来解决这个问题。如果他们不这样做,您可以请求他们添加对用户指定的群集对象的支持。