2014-09-09 5 views
0

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

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

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

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

+0

OT: 'library (doParallel); registerDoParallel (2)' будет работать и с plyr. И каждый другой параллельный бэкэнд (doMPI, doSNOW). – Marek

+0

no ... 'doMC' экспортирует все параметры plyr. См. Комментарий @hadley по этому вопросу: http://stackoverflow.com/questions/5559287/how-do-i-make-dosmp-play-nicely-with-plyr – Jonas

+0

Было три года назад;) – Marek

ответ

1

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

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

Смежные вопросы