2017-02-22 75 views
1

Я пытаюсь перевести цикл for в цикл, используя foreach.Как выводить два вектора, которые итеративно заполняются с помощью 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, чем на петли. Таким образом, вы не можете заполнить вектор контуром 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

Спасибо, Prive! –

+0

@AlbertDorador Если вы согласны с ответом, вы можете принять его. –