我正在使用
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
最好的问候
答案 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