2017-02-22 71 views
1

我想要使用foreach將for循環轉換爲循環。如何輸出使用foreach迭代填充的兩個向量?

我已經嘗試了幾個輸出方法玩.combine參數,但我不能輸出我創建的兩個向量,方法是首先初始化它們以保存1e4零,然後在每次迭代中重新填充每個條目。

特別是,我無法恢復以這種方式創建的載體:

Va = numeric(1e4) 
Vb = numeric(1e4) 

result = foreach(j = 1:1e4, .multicombine=TRUE) %dopar% 
{ 

    ... rest of the code ... 

    Va[j] = sample(4,1) 
    Vb[j] = sample(5,1) 
    list(retSLSP, retBH) 
} 

注意,j是在foreach循環的循環變量。還要注意,我所展示的計算不是我在代碼中的實際計算,而是與本例相同。

+2

這不是foreach循環的工作方式。他們遵循功能性編程範例,只要他們不允許副作用。它們實際上比sapply更類似於for循環。總之,你不能用一個foreach循環來填充一個向量(好吧,有一種方法,但這是一種糟糕的做法,並且不如for循環)。 – Roland

+0

謝謝,我懷疑這不僅困難,而且可能(接近)不可能做到。我使用foreach循環而不是for循環獲得的計算速度是顯而易見的,但並不重要。但是,也許我可以避免這種填充矢量的方法。有沒有辦法讓foreach函數知道我希望在每次迭代中保存這兩個值(根本不創建Va和Vb向量)? –

+1

您可以返回c(a,b)並使用.combine = rbind來獲取矩陣。然後只需索引兩列來檢索兩個向量。 – thc

回答

1

您可以使用共享內存被所有線程訪問。

library(bigmemory) 
V <- big.matrix(1e4, 2) 
desc <- describe(V) 

result = foreach(j = 1:1e4, .multicombine=TRUE) %dopar% 
{ 
    V <- bigmemory::attach.big.matrix(desc) 

    ... rest of the code ... 

    V[j, 1] = sample(4,1) 
    V[j, 2] = sample(5,1) 
    list(retSLSP, retBH) 
} 

Va <- V[, 1] 
Vb <- V[, 2] 
rm(V, desc) 

儘管如此,最好是通過塊進行並行而不是整個循環。 舉例:https://stackoverflow.com/a/45196081/6103040

+0

謝謝! –

+0

@AlbertDorador如果你對答案沒問題,你可以接受。 –