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.3The 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 1other attached packages:[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3 解决方案 @Tensibai is right. When trying to use doParallel on Windows, you have to "export" the functions that you want to use that are not in the current scope. In my experience, the way I've made this work is with the following (redacted) example.format_number <- function(data) { # do stuff that requires stringr}format_date_time <- function(data) { # do stuff that requires stringr}add_direction_data <- function(data) { # do stuff that requires dplyr}parse_data <- function(data) { voice_start <- # vector of values voice_end <- # vector of values target_phone_numbers <- # vector of values parse_voice_block <- function(block_start, block_end, number) { # do stuff } number_of_cores <- parallel::detectCores() - 1 clusters <- parallel::makeCluster(number_of_cores) doParallel::registerDoParallel(clusters) data_list <- foreach(i = 1:length(voice_start), .combine=list, .multicombine=TRUE, .export = c("format_number", "format_date_time", "add_direction_data"), .packages = c("dplyr", "stringr")) %dopar% parse_voice_block(voice_start[i], voice_end[i], target_phone_numbers[i]) doParallel::stopCluster(clusters) output <- plyr::rbind.fill(data_list)}Since the first three functions aren't included in my current environment, doParallel would ignore them when firing up the new instances of R, but it would know where to find parse_voice_block since it's within the current scope. In addition, you need to specify what packages should be loaded in each new instance of R. As Tensibai stated, this is because you're not running forking the process, but instead firing up multiple instances of R and running commands simultaneously. 这篇关于doParallel“foreach"不一致地从父环境继承对象:“{中的错误:任务 1 失败-“找不到函数...";的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
07-23 03:19
查看更多