2017-02-23 208 views
1

我在我的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

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

回答

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