您好我使用%dopar%
包的foreach
并行功能(parallel
作为后端)
我有一行像这样的代码
exportedFn <- #STUFF
exportedPkg <- #STUFF
allDataT <- foreach(myFile=orderFiles, .combine='rbind', .packages=exportedPkg, .export=exportedFn) %dopar% getSetOrderData(myFile, f.type="SUBMIT");
问题是getSetOrderData
调用不同的函数,这些函数本身调用函数。看起来我必须指定所有子功能......
我有办法避免这样做吗?
答案 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
的脚本并粘贴了这两个函数,但是将它们称为fsub2
和fmain2
。如果我按以下方式打电话:
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()
?