Foreach不执行IF语句

问题描述:

我在我的R代码的多个for语句之一中实现了foreach。它返回主结果(所有迭代之后的结果),但是它不会在代码中执行IF语句。Foreach不执行IF语句

在我的代码的框架下(它放置所有内容太长)。if语句不起作用,变量“Disc_Time”保持不变(如初始化)。我做错了什么或失踪?我试着用.export =“f”和.export = ls(GlovalEnv),但没有成功。

library(foreach) 
library(doParallel) 


cores=detectCores() 
cl <- makeCluster(cores[1]-1) #not to overload your computer 
registerDoParallel(cl) 

Disc_Time<-c("UE","Beam_order","Time") 
.... MORE VARIABLES 
MDP_x<-foreach (d = 1:length(dista),.combine='c')%dopar% 
{ 

for (q in 1:sim) 
{ 
    for (ue in 1:n) 
    {  
    for (i in 1:length(seq_order_BS)) 
    { 
     for (j in 1:length(seq_order_UE)) 
     { 
     if(first==0) 
     { 
     Disc_Time<-rbind(Disc_Time,c(ue,i,D_Time))    
     } 

    } 
    } 
} 
} 
stopcluster(cl) 
+0

'first'在你展示的代码未初始化的值。它是在你的完整代码中初始化的吗? – G5W

+0

是的,是的。代码完美。 –

要查看您的if语句的工作,我们需要知道first是如何设置的,和什么样的价值有你的循环之前。无论如何,它看起来并不像first更改,所以它确实应该放在您的%dopar%声明之外。

这就是说,if语句不是你的问题。 foreach返回表达式中每个返回的列表。例如:

ls <- foreach(d = 1:5) %dopar% { 
    return(i) 
} 

给出了一个包含数字1到5的列表ls

函数中唯一的表达式是对Disc_Time的转让调用。这将在每个节点中进行评估,并且永远不会返回到父级环境。 Disc_Time永远不会改变代码被调用的地方)。

它看起来好像你正试图设置你的并行功能的副作用(改变Disc_Time),据我所知在并行上下文中是不可能的。也许你想:那么

MDP_x<-foreach (d = 1:length(dista),.combine='c')%dopar% 
{ 

for (q in 1:sim) 
{ 
    for (ue in 1:n) 
    {  
    for (i in 1:length(seq_order_BS)) 
    { 
     for (j in 1:length(seq_order_UE)) 
     { 
     if(first==0) 
     { 
     return(rbind(Disc_Time,c(ue,i,D_Time))) 
     } else { 
     return(NA) 
     } 

    } 
    } 
} 
} 
stopcluster(cl) 

MDP_x应该有你想要的每一个d