I have a problem with foreach that I just can't figure out. The following code fails on two Windows computers I've tried, but succeeds on three Linux computers, all running the same versions of R and doParallel:
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()
On these two Windows computers, the following error is returned:
Error in { : task 1 failed - "could not find function "f""
However, this works just fine on the Linux computers, and also works just fine with %do% instead of %dopar%, and works fine for a regular for loop.
The same is true with variables, e.g. setting i <- 10
and replacing return(x + f())
with return(x + i)
For others with the same problem, two workarounds are:
1) explicitly import the needed functions and variables with .export:
r = foreach(x=1:4, .export="f") %dopar%
2) import all global objects:
r = foreach(x=1:4, .export=ls(.GlobalEnv)) %dopar%
The problem with these workarounds is that they aren't the most stable for a big, actively developing package. In any case, foreach is supposed to behave like for.
Any ideas of what's causing this and if there's a fix?
Version info of the computer that the function works on:
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
The computer the function doesn't work on:
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
f()
function in your example code? Based on what you've provided, it seems as though the Windows machine is giving the right error asf
is not a function, but instead a number. – Appointmentfork
used by doParallel, the workaround is to start an entire new R session to put the job in, IIRC it copy the parent environment, here theg
function env and not Global one. – Trimble