代码之家  ›  专栏  ›  技术社区  ›  Marc in the box

如何使用parlappy将参数从外部函数传递到内部函数

  •  1
  • Marc in the box  · 技术社区  · 7 年前

    我试图创建一个执行并行引导例程的R函数,但在parlappy中传递函数参数时遇到了困难。 下面是一个(希望如此)可重复的示例,其中集群无法找到参数的值:

    innerFun <- function(a=rnorm(10), q=0.5){
      quantile(a, probs = q)
    }
    
    library(parallel)
    bootFun <- function(a=rnorm(10), q=0.5, nperm=10, no_cores = detectCores() - 1){
    
      parFun <- function(x){
        set.seed(x)
        ai <- sample(a, size=length(a), replace = TRUE)
        return(innerFun(a=ai, q=q))
      }
    
      ARGS <- list("innerFun", "a", "q", "nperm")
    
      cl <- parallel::makeCluster(no_cores, type="PSOCK")
      nn <- split(1:nperm, 1:nperm)
      parallel::clusterExport(cl, varlist = ARGS)
      res <- parallel::parLapply(cl, nn, parFun)
      parallel::stopCluster(cl)
    
      res <- do.call("rbind", res)
      return(res)
    
    }
    
    set.seed(1)
    res1 <- bootFun(a=rnorm(100), q=0.5, nperm=10, no_cores = detectCores() - 1)
    # Error in get(name, envir = envir) : object 'a' not found
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   CPak    7 年前

    这是 parallel::clusterExport . 正如文件中所说,

    clusterExport assigns the values on the master R process of the variables named in varlist to variables of the same names in the global environment (aka ‘workspace’) of each node

    也就是说,它在全局环境中查找变量名。默认值 environment 论点也证明了这一点

    clusterExport(cl = NULL, varlist, envir = .GlobalEnv)

    您需要将环境指定给函数(非全局)环境,如下所示

    clusterExport(cl, args, env = environment())
    

    在您的情况下,更新到

    parallel::clusterExport(cl, varlist = ARGS, env = environment())
    

    替换为更新版本,这将导致 res1

               50%
    1   0.11379733
    2  -0.01619026
    3   0.05117174
    4  -0.11234621
    5   0.37001881
    6   0.07445315
    7   0.01455376
    8  -0.03924000
    9   0.01481569
    10  0.18364332