2013-04-22 50 views
1
命名的所有功能

你好,我现在用的是foreach包的%dopar%并行功能(parallel作为后端) 我有这样我能做些什么,以避免使用的foreach

exportedFn <- #STUFF 
exportedPkg <- #STUFF 
allDataT <- foreach(myFile=orderFiles, .combine='rbind', .packages=exportedPkg, .export=exportedFn) %dopar% getSetOrderData(myFile, f.type="SUBMIT"); 

问题一行代码是getSetOrderData调用不同的函数,这些函数本身调用函数。它看起来像我必须指定所有子功能...

有没有办法让我避免这样做?

+0

把所有的功能放在一个包里? – Roland 2013-04-22 09:59:05

+0

:) come'on @Rolland \t这样做是很多工作,当然有一些简单的东西比如导出环境或... – statquant 2013-04-22 10:02:53

+0

这些函数在哪里定义?大概不包,因为你通过“exportedPkg”处理它们。他们都在'.GlobalEnv',还是在其他地方? – 2013-04-22 16:40:47

回答

3

确保所有变量都在与getSetOrderData相同的环境中定义?我发现,如果我定义

fsub <- function(x){ 
    return(x^2) 
} 

fmain <- function(x){ 
    x <- fsub(x) + 2 
    return(x) 
} 

然后我这样使用:

require(doParallel) 
cl <- makeCluster(2 , outfile = "") 
registerDoParallel(cl) 
foreach(k = 1:2 , .verbose = TRUE , .combine = c) %dopar%{ 
    fmain(k) 
} 

我得到的结果如我所料:

numValues: 2, numResults: 0, stopped: TRUE 
automatically exporting the following variables from the local environment: 
    fmain, fsub 
got results for task 1 
numValues: 2, numResults: 1, stopped: TRUE 
returning status FALSE 
got results for task 2 
numValues: 2, numResults: 2, stopped: TRUE 
first call to combine function 
evaluating call object to combine results: 
    fun(result.1, result.2) 
returning status TRUE 
[1] 3 6 

而且进一步,如果我调用的函数 - 这些在.GlobalEnv之内没有另外定义 - 在使用source()的另一个函数内仍然有效。假设我在我的主目录内创建了一个名为util_funcs.R的脚本,并粘贴这两个函数,但将它们称为fsub2fmain2。如果我把它以下列方式:

fsource <- function(x){ 
    source("~/util_funcs.R") 
    x <- fmain2(x) 
    return(x) 
} 

它仍然有效:

numValues: 2, numResults: 0, stopped: TRUE 
automatically exporting the following variables from the local environment: 
    fsource 
got results for task 1 
numValues: 2, numResults: 1, stopped: TRUE 
returning status FALSE 
got results for task 2 
numValues: 2, numResults: 2, stopped: TRUE 
first call to combine function 
evaluating call object to combine results: 
    fun(result.1, result.2) 
returning status TRUE 
[1] 3 6 

你能只复制/粘贴在一个简易R脚本的所有功能,并使用source()

+0

而不是从任务函数(可能被调用很多次)调用'source',我会用'clusterEvalQ(cl,source(“ 〜/ util_funcs.R“))'。它更加高效,并且这些函数可用于任何数量的'foreach'循环。 – 2013-04-23 16:19:31

相关问题