2017-09-22 141 views
2

我正在RStudio在Windows 7我寫了一個主腳本生成57個新的R腳本,每個運行基於兩個參數的函數命令:使用該系統運行多個存在的R腳本()命令

vector1 <- c(1:19) 
vector2 <- c(1:3) 

首先,主腳本使用兩個for循環(使用索引「ABC」的向量1,一個一個使用索引「高清」爲vector2)產生在我的工作目錄每57個腳本採用以下文件名約定:

run_inference_<<vector1[abc]>>_<<vector2[def]>>.R 

該部分成功運行 - 每個57腳本都使用正確的命令生成。我的工作目錄現在包含文件run_inference_1_1.Rrun_inference_1_2.R

我想要做的,然後從我的主運行所有57個腳本,同時的最後一件事。我在for循環中嘗試了以下內容:

system(paste0("Rscript run_inference_",abc, "_", def, ".R"),wait = F) 

這不起作用。但是,如果我打開57個生成的腳本之一併運行它,那麼我將從該腳本中獲得所需的結果。這告訴我這個問題在我寫的system()命令中。

57個腳本中的每一個腳本都不是計算密集型的,但我現在要做的測試需要2分鐘。如何編輯我的system()命令同時執行所有57個腳本?

+0

'sapply(paste0( 「RSCRIPT run_inference _」,美國廣播公司, 「_」,閃避, 「.R」),系統等待= F)'沒有評論時是否生成並運行57腳本是一個很好的想法或不是你的問題。 – Vlo

+1

我的確反映了Vlo的不言自明的擔憂,即可能有更好的方法來做到這一點。爲什麼你想寫出腳本,而不是像做一個功能那樣需要輸入所需的功能,而只是用你想要的57個不同的輸入來運行那個功能? – Dason

+0

我擁有資源充足的個人電腦,應該能夠處理非常密集的工作,而熟悉並行計算的同事告訴我,考慮到可用的情況,這個任務應該是可行的。我們將看到! – tfmunkey

回答

3

除非您正在運行的程序知道如何平行化腳本本身,否則您不需要使用大腳本調用system一次。您可以通過從不同的R流程多次調用system來完成此操作。

scripts <- paste0("Rscript run_inference_", abc, "_", def, ".R") 

# make lots of R processes, assuming the script to be called won't eat CPU 
cl <- parallel::makeCluster(30) 

parallel::parLapply(cl, scripts, function(script) system(script)) 
parallel::stopCluster(cl) 
+0

謝謝。我會試驗一下,看看它是如何發展的。 像這樣的大型工作對我來說是新的,所以這是一場偉大的'火災的洗禮',就像它一樣。 – tfmunkey