半全局变量转换为mclapply

3

在一个函数中,我需要对列表中的每个项目运行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内声明。

2个回答

3

您可以为函数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)

正常工作。


谢谢!这些信息很有用,我之前不知道。Sven的回答在我的具体情况下最实用。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接