我试图在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)
}
非常感谢任何建议。
答案 0 :(得分:0)
您可以在模型函数中定义任何必要的辅助函数。在这种情况下:
false
看起来你需要在这个函数的开头做任何worker初始化。因此,如果您的函数需要从另一个包中调用函数,那么您还需要在模型函数的开头加载该包。
我建议您向软件包开发人员发送一封电子邮件,看看他们是否有更好的解决方案来解决这个问题。如果他们不这样做,您可以请求他们添加对用户指定的群集对象的支持。