在r中需要使用多程序時,常見方案是使用foreach
和doparallel
的組合。
foreach
包中最重要的是foreach
函式,該函式建立乙個foreach
物件,隨後序列或並行的執行表示式。
library(foreach)?foreach
out:
foreach( ..., .combine, .init, .final = null, .inorder = true, .multicombine = false, .maxcombine = if (.multicombine) 100 else 2, .errorhandling = c("stop", "remove", "pass"), .packages = null, .export = null, .noexport = null, .verbose = false)e1 %:% e2when(cond)obj %do% exobj %dopar% extimes(n)
foreach
函式在建立時常用的幾個引數為:
...
: 表示式中使用的變數。
.packages
: 表示式依賴的包,字元向量。
.export
: 表示式依賴的變數,字元向量。
.combine
: 運算後結果的組合方式,預設為列表,可選'c'
'cbind'
'rbind'
'+'
'*'
等。
.errorhandling
: 當執行**現錯誤時的處理方式。
使用時,物件後接%do%
為序列,%dopar%
為並行。
foreach(i=1:3) %do% sqrt(i)
out:
[[1]][1] 1[[2]][1] 1.414214[[3]][1] 1.732051
當使用%do%
執行時,程式將會自動忽略.packages
與.export
變數。
如果需要使用多程序,不只需要更換成%dopar%
,你還需要註冊集群,執行,結束集群。
library(doparallel)cl = makecluster(4) #註冊4個程序的集群registerdoparallel(cl)foreach(i=1:3) %dopar% sqrt(i)stopcluster(cl) # 記得結束集群
對多程序進行包裝,形成runparallel
函式。
library(foreach)library(doparallel)runparallel = function(fun,params,packages = null,export = null) stopcluster(cl) r}
程式中的do.call
能夠使用提供的引數執行fun
函式。
runparallel
函式傳入fun
與並行引數的列表集合params
,就可以使用fun
對每個值進行處理,然後返回全部值。
在實際使用中遇到這樣乙個問題,在這裡把問題稍微簡化一下。
有兩個檔案,do_some_thing.r
和do_some_other_thing.r
,裡面各自編寫了乙個函式。
do_some_thing.r
do_some_thing = function(x)
do_some_other_thing.r
do_some_other_thing = function(x)
很明顯,do_some_thing.r
中引用了do_some_other_thing.r
中的函式。
現在我source
這兩個檔案並暴露這兩個函式,編寫乙個函式呼叫do_some_thing
。
some_thing = new.env()source('do_some_thing.r',local = some_thing)some_other_thing = new.env()source('do_some_other_thing.r',local = some_other_thing)attach(some_thing)attach(some_other_thing)fun = function(x)
然後進行多程序呼叫。
得到錯誤。
error in r}
runparallel(fun,params)
out:
[[1]][1] 2[[2]][1] 4.5······
成功。
十分推薦dofuture
包!
我是sssimon yang,關注我,用code解讀世界
[1]
dofuture
包:
恢復低版本的FlashPlayer
做頁遊開發,經常會遇到一些很奇怪的問題。我最近就遇到乙個問題 使用者進入遊戲,只顯示遊戲部分介面,chrome瀏覽器是正常的,就ie死活不行,而我自己的ie卻又是可以的 都是ie8 右擊看了一下flash player的版本號,她的ie8使用的flash player版本號比她本機的chrome要高...
恢復低版本的FlashPlayer
做頁遊開發,經常會遇到一些很奇怪的問題。我最近就遇到乙個問題 使用者進入遊戲,只顯示遊戲部分介面,chrome瀏覽器是正常的,就ie死活不行,而我自己的ie卻又是可以的 都是ie8 右擊看了一下flash player的版本號,她的ie8使用的flash player版本號比她本機的chrome要高...
ubuntu10 04安裝低版本的gcc
ubuntu10.04降低gcc和g 版本的過程 ubuntu10.04的預設安裝是4.4版本的gcc和g 可以通過gcc v命令檢視 下面就進入安裝gcc 3.4.6的過程 gcc 3.4 3.4.6 6ubuntu3 i386.deb cpp 3.4 3.4.6 6ubuntu3 i387.de...