multidplyr: назначить функции для кластера

(см. рабочий раствор ниже)

Я хочу использовать multidplyr для распараллеливания функции:

calculs.R
f <- function(x){
return(x+1)
}

main.R
library(dplyr)
library(multidplyr)
source("calculs.R")
d <- data.frame(a=1:1000,b=sample(1:2,1000),replace=T)

result <- d %>% 
   partition(b) %>% 
     do(f(.)) %>%
     collect()  

Я тогда получаю:

Initialising 3 core cluster.
Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
  2 nodes produced errors; first error: could not find function "f"
In addition: Warning message:
group_indices_.grouped_df ignores extra arguments 

Как я могу назначить исходные функции для каждого ядра?

==================

Вот безупречный сценарий:

Необходимо извлечь значение, чтобы обновить, и превратить результат в кадр данных

calcul.R
f <- function(x){
    return(data.frame(x$a+1))
    }

Необходимо установить кластеры и назначить функции источника

main.R
 library(dplyr)
library(multidplyr)
source("calculs.R")

cl <- create_cluster(3)
set_default_cluster(cl)
cluster_copy(cl, f)

d <- data.frame(a=1:10,b=c(rep(1,5),rep(2,5)))

  result <- d %>%
   partition(b) %>%
     do(f(.)) %>%
     collect()

1 ответ

Решение

Похоже, вы инициализировали кластер (хотя вы не показываете эту часть). Вам необходимо экспортировать переменные / функции из вашей глобальной среды для каждого работника. Предполагая, что вы сделали свой кластер как

cl <- create_cluster(3)
set_default_cluster(cl)

Ты можешь попробовать

cluster_copy(cl, f)    

Это будет копировать и экспортировать f каждому работнику (я думаю...)

дополнительный

Скорее всего, вы столкнетесь с другой проблемой: ваша функция принимает x в качестве аргумента, к которому вы добавляете 1

f <- function(x){
         return(x+1)
}

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

f <- function(x){
         return(x$a+1)
}
Другие вопросы по тегам