Предположим, что я хочу применять параллельно myfunction
для каждой строки myDataFrame
. Предположим, что otherDataFrame
является фреймворком данных с двумя столбцами: COLUNM1_odf
и COLUMN2_odf
по некоторым причинам используется в myfunction
. Так что я хотел бы написать код, используя parApply
так:R, dplyr и snow: как распараллелить функции, которые используют dplyr
clus <- makeCluster(4)
clusterExport(clus, list("myfunction","%>%"))
myfunction <- function(fst, snd) {
#otherFunction and aGlobalDataFrame are defined in the global env
otherFunction(aGlobalDataFrame)
# some code to create otherDataFrame **INTERNALLY** to this function
otherDataFrame %>% filter(COLUMN1_odf==fst & COLUMN2_odf==snd)
return(otherDataFrame)
}
do.call(bind_rows,parApply(clus,myDataFrame,1,function(r) { myfunction(r[1],r[2]) }
Проблема здесь состоит в том, что R не признает COLUMN1_odf
и COLUMN2_odf
даже если я вставляю их в clusterExport
. Как я могу решить эту проблему? Есть ли способ «экспортировать» весь объект, который нужен snow
, чтобы не перечислять каждый из них?
EDIT 1: Я добавил комментарий (в коде выше), чтобы указать, что otherDataFrame
создается interally для myfunction
.
EDIT 2: Я добавил некоторые псевдо-код, чтобы обобщать myfunction
: теперь он использует глобальную dataframe (aGlobalDataFrame
и другую функцию otherFunction
)
Аргументы вашей 'myFunction' должны держать все объекты. Попробуйте 'myFunction <- function (otherDataFrame, fst, snd) {...'. –
в действительности otherDataFrame - это объект, созданный в моей функции, поэтому я не могу перейти к нему. – enneppi
Вместо использования 'parApply' вы можете использовать' parLapply'. 'do.call (bind_rows, parLapply (clus, 1: nrow (myDataFrame), function (i, r) {myfunction (r [i, 1], r [i, 2])}'. (У меня нет протестировал это. Может все еще понадобиться какое-то вождение) – Benjamin