【问题标题】:Semi-global variable to mclapply用于 mclapply 的半全局变量
【发布时间】:2012-12-03 09:49:04
【问题描述】:

在函数中,我需要为列表中的每个项目运行mclapply,它还应该使用半全局变量var.1。我不想将var.1 添加到每个列表项,因为它会占用太多内存。这是说明问题的代码:

library(parallel)

list.1 <- list(1,2,3,4)

myInnerFunction <- function(xx) {
  return(xx+var.1)
}

myOuterFunction <- function(list.x) {
  var.1 <- 17
  tmp.1 <- mclapply(list.x, myInnerFunction, mc.cores=6)
  return(tmp.1)
}

results <- myOuterFunction(list.x=list.1)
[1] "Error in FUN(X[[1L]], ...) : object 'var.1' not found\n"
results[[1]] # This should be 18

如何将var.1 传递给mclapplyvar.1 必须在 myOuterFunction 中声明。

【问题讨论】:

    标签: r mclapply


    【解决方案1】:

    您可以为函数 myInnerFunction 创建第二个 (var.1) 参数:

    myInnerFunction <- function(xx, var.1) {
      return(xx+var.1)
    }
    

    现在可以在mclapply 命令中为myInnerFunction 函数传递第二个参数:

    myOuterFunction <- function(list.x) {
      var.1 <- 17
      tmp.1 <- mclapply(list.x, myInnerFunction, var.1, mc.cores=6)
      return(tmp.1)
    }
    

    结果:

    results <- myOuterFunction(list.x=list.1)
    
    
    [[1]]
    [1] 18
    
    [[2]]
    [1] 19
    
    [[3]]
    [1] 20
    
    [[4]]
    [1] 21
    

    【讨论】:

      【解决方案2】:

      你想要一个函数闭包吗?

      创建一个函数f,接受var.1作为参数,返回myInnerFunction

      f = function(var.1) {
          var.1 = var.1
          myInnerFunction <- function(xx)  return(xx+var.1)
      }
      

      那么myOuterFunction就是:

      myOuterFunction <- function(list.x) {
          var.1 <- 17
          my = f(var.1)
          tmp.1 <- mclapply(list.x, my, mc.cores=6)
          return(tmp.1)
      }
      

      myOuterFunction(list.x=list.1)
      

      按预期工作。

      【讨论】:

      • 谢谢!有用的信息,我不知道这个。事实证明,斯文的回答在我的具体情况下是最实用的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 2014-03-21
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多