我该怎么做才能避免使用foreach命名所有函数

时间:2013-04-22 09:52:39

标签: r foreach parallel-processing

您好我使用%dopar%包的foreach并行功能(parallel作为后端) 我有一行像这样的代码

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

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

我有办法避免这样做吗?

1 个答案:

答案 0 :(得分: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()