从命令行或脚本使用jags.parallel工作正常。我可以从http://www.inside-r.org/packages/cran/R2jags/docs/jags运行这个修改过的例子就好了
# An example model file is given in:
model.file <- system.file(package="R2jags", "model", "schools.txt")
#=================#
# initialization #
#=================#
# data
J <- 8.0
y <- c(28.4,7.9,-2.8,6.8,-0.6,0.6,18.0,12.2)
sd <- c(14.9,10.2,16.3,11.0,9.4,11.4,10.4,17.6)
jags.data <- list("y","sd","J")
jags.params <- c("mu","sigma","theta")
jags.inits <- function(){
list("mu"=rnorm(1),"sigma"=runif(1),"theta"=rnorm(J))
}
#===============================#
# RUN jags and postprocessing #
#===============================#
# jagsfit <- jags(data=jags.data, inits=jags.inits, jags.params,
# n.iter=5000, model.file=model.file)
# Run jags parallely, no progress bar. R may be frozen for a while,
# Be patient. Currenlty update afterward does not run parallelly
print("Running Parallel")
jagsfit <- jags.parallel(data=jags.data, inits=jags.inits, jags.params,
n.iter=5000, model.file=model.file)
但是如果我把它包装在一个函数
中testparallel <- functions(out){
# An example model file is given in:
.
.
.
jagsfit <- jags.parallel(data=jags.data, inits=jags.inits, jags.params,
n.iter=5000, model.file=model.file)
print(out)
return(jagsfit)
}
然后我收到错误: get(name,envir = envir)中的错误:object&#39; y&#39;未找到 根据我发现here的内容,我知道导出到群集的环境存在问题,我通过更改
修复了它J <- 8.0
y <- c(28.4,7.9,-2.8,6.8,-0.6,0.6,18.0,12.2)
sd <- c(14.9,10.2,16.3,11.0,9.4,11.4,10.4,17.6)
到
assign("J",8.0,envir=globalenv())
assign("y",c(28.4,7.9,-2.8,6.8,-0.6,0.6,18.0,12.2),envir=globalenv())
assign("sd",c(14.9,10.2,16.3,11.0,9.4,11.4,10.4,17.6),envir=globalenv())
有没有更好的解决方法?
谢谢你, 格雷格
P.S。
我正在为其他人制作此代码,所以我并不想改变R2jags包中的内容,让我通过环境导出,虽然我打算向包的作者提出建议。
答案 0 :(得分:4)
所以我联系了R2jags的作者,他在jags.parallel中添加了一个附加参数,让你传递envir,然后传递到clusterExport。
这很有效,除了它允许我的数据名称和jags.parallel函数中的变量之间的冲突。
答案 1 :(得分:0)
如果您并行使用JAGS,我建议您查看包rjags
并结合包dclone
。我认为dclone
非常强大,因为语法与rjags
完全相同。
我从来没有看到你的这个包的问题。
如果你想使用R2jags
我认为你需要将你的变量和init函数传递给具有该函数的worker:
clusterExport(cl, list("jags.data", "jags.params", "jags.inits"))
答案 2 :(得分:0)
在不更改R2jags
代码的情况下,您仍然可以使用list2env
以更简单的方式将这些数据变量分配到全局环境。
显然,人们担心这些变量名称可能会在全局环境中被覆盖,但您可能可以控制它。
下面是与原始帖子中给出的示例相同的代码,除了我将数据放入列表并使用list2env
函数将该列表的数据发送到全局环境中。 (另外我在函数中取出了未使用的“out”变量。)这对我来说运行正常;但是,您可能需要添加更多链和/或添加更多迭代才能看到行动中的并行性。
testparallel <- function(){
library(R2jags)
model.file <- system.file(package="R2jags", "model", "schools.txt")
# Make a list of the data with named items.
jags.data.v2 <- list(
J=8.0,
y=c(28.4,7.9,-2.8,6.8,-0.6,0.6,18.0,12.2),
sd=c(14.9,10.2,16.3,11.0,9.4,11.4,10.4,17.6) )
# Store all that data explicitly in the globalenv() as
# was previosly suggesting using the assign(...) function.
# This will do that for you.
# Now R2jags will have access to the data without you having
# to explicitly "assign" each to the globalenv.
list2env( jags.data.v2, envir=globalenv() )
jags.params <- c("mu","sigma","theta")
jags.inits <- function(){
list("mu"=rnorm(1),"sigma"=runif(1),"theta"=rnorm(J))
}
jagsfit <- jags.parallel(
data=names(jags.data.v2),
inits=jags.inits,
jags.params,
n.iter=5000,
model.file=model.file)
return(jagsfit)
}