Mam problem z foreach, którego po prostu nie mogę rozgryźć. nie działa na dwóch komputerach z systemem Windows próbowałem, ale udaje się na trzech komputerach Linux, wszystkie uruchomione te same wersje R i doParallel:doParallel "foreach" niekonsekwentnie dziedziczy obiekty ze środowiska nadrzędnego: "Błąd w {: zadanie 1 nie powiodło się -" nie może znaleźć funkcji ... "
library("doParallel")
registerDoParallel(cl=2,cores=2)
f <- function(){return(10)}
g <- function(){
r = foreach(x = 1:4) %dopar% {
return(x + f())
}
return(r)
}
g()
na tych dwóch komputerów z systemem Windows, następujące zwracany jest błąd:
Error in { : task 1 failed - "could not find function "f""
Jednak działa to dobrze na komputerach z systemem Linux, a także działa dobrze z% do% zamiast% dopar% i działa dobrze dla zwykłej pętli for.
To samo dotyczy zmiennych, np. Ustawienie i <- 10
i zastępując return(x + f())
z return(x + i)
Dla innych osób z tego samego problemu, dwa sposoby rozwiązania to:
1) wyraźnie import potrzebne funkcje i zmienne z .export:
r = foreach(x=1:4, .export="f") %dopar%
2) importowanie wszystkich obiekty globalne:
r = foreach(x=1:4, .export=ls(.GlobalEnv)) %dopar%
Problem z tymi obejściami polega na tym, że nie są one Najbardziej stabilny dla dużego, aktywnie rozwijającego się pakietu. W każdym razie foreach ma się zachowywać jak za.
Jakieś pomysły na to, co to powoduje i czy jest jakiś problem?
Informacje o wersji z komputerem, że funkcja działa na:
R version 3.2.2 (2015-08-14)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS release 6.5 (Final)
other attached packages:
[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3
Komputer funkcja nie działa na:
R version 3.2.2 (2015-08-14)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
other attached packages:
[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3
Gdzie jest funkcja 'f()' w twoim przykładowym kodzie? W zależności od tego, co podałeś, wydaje się, że komputer z systemem Windows podaje odpowiedni błąd, ponieważ 'f' nie jest funkcją, lecz liczbą. – brittenb
Od doParallel winiety: "Aby użyć funkcji podobnej do wielordzeniowej, określilibyśmy liczbę rdzeni do wykorzystania (ale zauważ, że w systemie Windows próba użycia więcej niż jednego rdzenia z równoległym skutkuje błędem)" Tj: windows does not nie zaimplementuj czegoś takiego jak 'fork' używanego przez doParallel, obejście polega na rozpoczynaniu całej nowej sesji R, aby umieścić pracę, IIRC kopiuje środowisko macierzyste, tutaj funkcja' g' env, a nie globalna. – Tensibai
@brittenb Przepraszamy, wprowadziłem niepełną zmianę; Zamierzałem zrobić f = function() {return (10)}. Edytowanie oryginału. – sssheridan