首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在函数中使用jags.parallel ( get(name,envir = envir)中的R语言错误:找不到对象'y‘)

在函数中使用jags.parallel ( get(name,envir = envir)中的R语言错误:找不到对象'y‘)
EN

Stack Overflow用户
提问于 2014-05-21 17:50:33
回答 3查看 3.3K关注 0票数 3

从命令行或脚本中使用jags.parallel很好。我可以在http://www.inside-r.org/packages/cran/R2jags/docs/jags上运行这个修改过的示例。

代码语言:javascript
复制
# 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)

但是,如果我将它包装在一个函数中

代码语言:javascript
复制
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):对象'y‘根据我找到的内容找不到,我知道这是导出到集群的环境中的一个问题,我已经通过更改来修复它。

代码语言:javascript
复制
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)

代码语言:javascript
复制
  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()) 

有什么更好的办法避开这件事吗?

谢谢你,格雷格

附注:

我正在为其他人编写这段代码,所以我真的不想改变R2jags包中的内容,让我在环境中传递导出,尽管我计划向包的作者推荐它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-10 23:02:16

因此,我联系了R2jags的作者,他在jags.parallel中添加了一个加法参数,让您可以将环境传递给clusterExport。

除了允许我的数据名称与jags.parallel函数中的变量之间发生冲突外,这是很好的。

票数 5
EN

Stack Overflow用户

发布于 2014-05-23 14:38:01

如果您在并行中使用密集的JAGS,我可以建议您将包rjags与包dclone相结合。我认为dclone非常强大,因为语法与rjags完全相同。我从来没见过你对这个包裹有意见。

如果您想使用R2jags,我认为您需要将变量和init函数传递给带有该函数的工作人员:

clusterExport(cl, list("jags.data", "jags.params", "jags.inits"))

票数 0
EN

Stack Overflow用户

发布于 2015-02-10 02:32:04

在不更改R2jags代码的情况下,仍然可以使用list2env以更简单的方式将这些数据变量分配给全局环境。

显然,人们担心这些变量名可能会在全局环境中被覆盖,但是您可能可以控制它。

下面是与最初文章中给出的示例相同的代码,但我将数据放入一个列表,并使用list2env函数将该列表的数据发送到全局环境中。(此外,我在函数中取出了未使用的" out“变量。)对于我来说,这目前运行得很好;但是,您可能需要添加更多的链和/或添加更多的迭代来查看并行性。

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23790452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档