Plyr, doMC и глобальные переменные

Я использую R (3.1), plyr и doMC в качестве параллельного бэкэнда (насколько мне известно, это единственный параллельный бэкенд, который работает с plyr)

Мой вопрос в том, как я могу писать глобальные переменные из рабочих потоков. У меня есть этот (очень искусственный) пример:

library(doMC)
library(plyr)
registerDoMC(cores=2)

result1 = data.frame(id=c(1:3), a=NA)
result2 = data.frame(id=c(1:3), b=NA)

f = function(x){
    result1[ result1$id==x$id, "a"] <<- x$a
    result2[ result2$id==x$id, "b"] <<- x$b
}

data = data.frame(id=c(1:3), a=c(4:6), b=c(7:9))
a_ply(data, .margins=1, .fun=f, .parallel=T)

Поскольку я хочу заполнить 2 кадра данных, я не могу использовать aaply или adply. Пример делает то, что должен делать с parallel=FALSE. Когда я делаю это параллельно, data.frames результата остаются пустыми. Я знаю, что мне нужно экспортировать глобальные переменные в рабочие процессы, и я пытался использовать .paropts=list(.export=c("result1", "result2")), но это не помогает....

Кто-нибудь знает, как экспортировать глобальные переменные в doMC воркеров? Или есть другое решение, которое заполняет оба data.frames в параллельной среде (мазбе без plyr?)


person Jonas    schedule 09.09.2014    source источник
comment
OT: library(doParallel);registerDoParallel(2) будет работать и с plyr. И любой другой параллельный бэкенд (doMPI, doSNOW).   -  person Marek    schedule 09.09.2014
comment
no...doMC экспортирует все необходимые plyr параметры. См. комментарий @hadley к этому вопросу: stackoverflow.com/questions/5559287/   -  person Jonas    schedule 09.09.2014
comment
Это было три года назад ;)   -  person Marek    schedule 09.09.2014
comment
хм... однако. doParallel не работает в моей 64-битной системе Ubuntu.   -  person Jonas    schedule 09.09.2014


Ответы (1)


Вы не можете изменить глобальный объект из параллельных рабочих процессов. Вот почему вам нужно экспортировать свои data.frames - рабочие не могут получить доступ к глобальной среде и изменяют только экспортированную копию.

Вам нужно переписать свою функцию, чтобы она возвращала какое-то значение, которое позже вы можете использовать для заполнения data.frame.

person Marek    schedule 09.09.2014