首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mclapply的半全局变量

mclapply的半全局变量
EN

Stack Overflow用户
提问于 2012-12-03 17:49:05
回答 2查看 823关注 0票数 3

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

代码语言:javascript
复制
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内声明。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-03 18:00:21

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

代码语言:javascript
复制
myInnerFunction <- function(xx, var.1) {
  return(xx+var.1)
}

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

代码语言:javascript
复制
myOuterFunction <- function(list.x) {
  var.1 <- 17
  tmp.1 <- mclapply(list.x, myInnerFunction, var.1, mc.cores=6)
  return(tmp.1)
}

结果是:

代码语言:javascript
复制
results <- myOuterFunction(list.x=list.1)


[[1]]
[1] 18

[[2]]
[1] 19

[[3]]
[1] 20

[[4]]
[1] 21
票数 3
EN

Stack Overflow用户

发布于 2012-12-03 17:56:27

函数闭包是你想要的吗?

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

代码语言:javascript
复制
f = function(var.1) {
    var.1 = var.1
    myInnerFunction <- function(xx)  return(xx+var.1)
}

那么myOuterFunction就是:

代码语言:javascript
复制
myOuterFunction <- function(list.x) {
    var.1 <- 17
    my = f(var.1)
    tmp.1 <- mclapply(list.x, my, mc.cores=6)
    return(tmp.1)
}

代码语言:javascript
复制
myOuterFunction(list.x=list.1)

按照预期工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13680683

复制
相关文章

相似问题

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