r - 如何在R函数中将对象导出到并行集群

标签 r function parallel-processing

我正在编写一个用于合并和组织数据的函数,然后使用基本R中的并行函数并行运行MCMC链。我的函数如下。

dm100zip <- function(y, n.burn = 1, n.it = 3000, n.thin = 1) {
  y <- array(c(as.matrix(y[,2:9]), as.matrix(y[ ,10:17])), c(length(y$Plot), 8, 2))
  nplots <- nrow(y)
  ncap1 <- apply(y[,1:8, 1],1,sum)
  ncap2 <- apply(y[,1:8, 2],1,sum)
  ncap <- as.matrix(cbind(ncap1, ncap2))
  ymax1 <- apply(y[,1:8, 1],1,sum)
  ymax2 <- apply(y[,1:8, 2],1,sum)

  # Bundle data for JAGS/BUGS
  jdata100 <- list(y=y, nplots=nplots, ncap=ncap)

  # Set initial values for Gibbs sampler
  inits100 <- function(){
    list(p0=runif(1, 1.1, 2),
      p.precip=runif(1, 0, 0.1),
      p.day = runif(1, -.5, 0.1))
  }

  # Set parameters of interest to monitor and save
  params100 <- c("N", "p0")

  # Run JAGS in parallel for improved speed
  CL <- makeCluster(3) # set number of clusters = to number of desired chains
  clusterExport(cl=CL, list("jdata100", "params100", "inits100", "ymax1", "ymax2", "n.burn", "jag", "n.thin")) # make data available to jags in diff cores
  clusterSetRNGStream(cl = CL, iseed = 5312)

  out <- clusterEvalQ(CL, {
    library(rjags)
    load.module('glm')
    jm <- jags.model("dm100zip.txt", jdata100, inits100, n.adapt = n.burn, n.chains = 1)
    fm <- coda.samples(jm, params100, n.iter = n.it, thin = n.thin)
    return(as.mcmc(fm))

  })

  out.list <- mcmc.list(out) # group output from each core into one list
  stopCluster(CL)

  return(out.list)
}


当我运行该函数时,出现一个错误,提示找不到clusterExport函数中使用的n.burn,n.it和n.thin。例如,

dm100zip.list.nain <- dm100zip(NAIN, n.burn = 1, n.it = 3000, n.thin = 1) # returns error


如果我在运行函数之前为它们中的每一个设置值,那么它将使用这些值并且运行良好。例如,

n.burn = 1
n.it = 1000
n.thin = 1
dm100zip.list.nain <- dm100zip(NAIN, n.burn = 1, n.it = 3000, n.thin = 1) 


这可以正常运行,但使用n.it = 1000而不是3000

有人可以提供帮助,为什么ClusterExport函数使用全局环境中的对象,而不使用运行ClusterExport的函数分配的值?有没有解决的办法?

最佳答案

默认情况下,clusterExport在全局环境中查找“ varlist”指定的变量。在您的情况下,应在dm100zip函数的本地环境中查看。为此,请使用clusterExport“ envir”参数:

clusterExport(cl=CL, list("jdata100", "params100", "inits100", "ymax1",
                          "ymax2", "n.burn", "jag", "n.thin"),
              envir=environment())


注意,还将找到在全局环境中定义的“ varlist”中的变量,但在dm100zip中定义的值将优先。

关于r - 如何在R函数中将对象导出到并行集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22739876/

相关文章:

r - inline::cxxfunction 在 knitr 中显示不佳

javascript - 您将如何在函数中创建一个非本地化变量,以便它可以被 javascript 中的其他函数访问?

c++ - OpenCV - 如何在我的 LAN 中的单独主机中处理视频的每一帧?

c# - CancellationToken Cancel 不脱离 BlockingCollection

r - 使用 readxlsb 和 cellranger::cell_limits() 获取所有小数位

r - 在R中执行并行计算时,是否有一种释放内存的方法

c - 不返回字符串。这个程序将 123 这样的数字转换为 "One Two Three"这样的单词,为什么最后我什么也没有得到?

javascript - 此 javascript 函数和显示命令示例的更高效版本

docker - docker 是否可以并行构建多阶段镜像?

r - 在 R 编程中修复波动率曲面图的插值