使用assign分配功能输出

时间:2014-07-24 11:36:50

标签: r eval assign

我正在使用

library(foreach)
library(doSNOW)

我有一个函数mystoploss(data,n=14)

然后我将其称为(I want to loop over n=14 for now)

registerDoSNOW(makeCluster(4, type = "SOCK"))

foreach(i = 14) %dopar% {assign(paste("Performance",i,sep=""),
mystoploss(data=mydata,n=i))}

然后我尝试从上方Performance14找到but it is not assigned

是否有某种分配方式,因此输出将在Performance14

如果我使用

foreach(i = 14) %dopar% {assign(paste("Performance",i,sep=""),
    mystoploss(data=mydata,n=i),envir = .GlobalEnv)}

我收到错误:

Error in e$fun(obj, substitute(ex), parent.frame(), e$data) : 
  worker initialization failed: Error in as.name

最好的问候

1 个答案:

答案 0 :(得分:1)

这是因为分配操作发生在工作进程中。正在发送变量的值(请参阅您的R会话控制台),但不会发送您指定的名称。您需要捕获这些值并再次为它们指定名称。请参阅此相关question

以下是一个可能有帮助的替代方案:将foreach的输出设置为中间变量,并将其分配给当前主进程中的所需变量'环境。

PerformanceAll <- foreach(i = 1:14,.combine="c") %dopar% { mystoploss(data=mydata,n=i) } #pick .combine appropriately
for(i in 1:14){ assign(paste("Performance",i,sep=""), PerformanceAll[i]) }

以下是我尝试的完整示例:

library(foreach)
library(doSNOW)
mystoploss <- function(data=1,n=1){
  return(runif(data)) #some operation, returns a scalar
}
mydata <- 1
registerDoSNOW(makeCluster(4, type = "SOCK"))
PerformanceAll <- foreach(i = 1:14,.combine="c") %dopar% { mystoploss(data=mydata,n=i) }#pick .combine appropriately
for(i in 1:14){ assign(paste("Performance",i,sep=""), PerformanceAll[i]) }

编辑:如果mystoploss的输出是列表,请执行以下更改:

mystoploss <- function(data=1,n=1){#Example
  return(list(a=runif(data),b=1)) #some operation, return a list
}
PerformanceAll <- foreach(i = 1:14) %dopar% { mystoploss(data=mydata,n=i) }#remove .combine
for(i in 1:14){ assign(paste("Performance",i,sep=""), PerformanceAll[[i]]) } #double brackets