【发布时间】:2016-04-11 18:00:00
【问题描述】:
我对 foreach 有一个我无法弄清楚的问题。以下代码在我尝试过的两台 Windows 计算机上失败,但在三台 Linux 计算机上成功,它们都运行相同版本的 R 和 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()
在这两台 Windows 计算机上,返回以下错误:
Error in { : task 1 failed - "could not find function "f""
但是,这在 Linux 计算机上运行良好,并且使用 %do% 而不是 %dopar% 也运行良好,并且适用于常规 for 循环。
变量也是如此,例如设置i <- 10 并将return(x + f()) 替换为return(x + i)
对于遇到相同问题的其他人,两种解决方法是:
1) 使用 .export 显式导入所需的函数和变量:
r = foreach(x=1:4, .export="f") %dopar%
2) 导入所有全局对象:
r = foreach(x=1:4, .export=ls(.GlobalEnv)) %dopar%
这些变通方法的问题在于,它们对于一个正在积极开发的大型软件包来说并不是最稳定的。在任何情况下,foreach 的行为都应该类似于 for。
关于导致此问题的原因以及是否有解决方法的任何想法?
该功能所运行的计算机的版本信息:
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
该功能不起作用的计算机:
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()函数在哪里?根据您提供的内容,Windows 机器似乎给出了正确的错误,因为f不是一个函数,而是一个数字。 -
来自 doParallel vignette:“要使用类似多核的功能,我们将指定要使用的核心数量(但请注意,在 Windows 上,尝试使用多个并行的核心会导致错误)" 即:windows 没有实现 doParallel 使用的
fork之类的东西,解决方法是启动一个全新的 R 会话以将作业放入,IIRC 它复制父环境,这里是g函数 env 而不是全局一。 -
@brittenb 抱歉,我做了不完整的更改;我的意思是做 f = function(){return(10)}。编辑原件。
-
@Tensibai 有趣。这是针对类似“多核”的功能,但该软件包会自动在 Windows 上使用类似“雪”的功能。不过,这可能会得到它....
-
不,很遗憾没有。您可以通过注册 registerDoParallel(cl=2) 在 Linux 上使用类似“雪”的功能,但这仍然适用于 Linux,但在 Windows 上仍然失败。
标签: r foreach parallel-processing doparallel