2017-09-22 12 views
2

Ich bin mit RStudio in Windows 7. Ich habe ein Master-Skript geschrieben, den 57 neuen R-Skripte, die jeweils mit den Befehlen erzeugt eine Funktion von zwei Parametern basieren auszuführen:Ausführen mehrere Skripte R unter Verwendung des Systems() Befehl

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

Zuerst verwendet das Master-Skript zwei for-Schleifen (man den Index 'abc' mit für vector1, ein den Index 'def' mit für vector2) jeden des 57 Skripte in meinem Arbeitsverzeichnis zu generieren dass nehmen Sie die folgenden Dateikonvention:

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

Dieser Teil läuft erfolgreich - jedes der 57 Skripte mit den korrekten Befehle innerhalb erzeugt. Mein Arbeitsverzeichnis enthält nun Dateien run_inference_1_1.R, run_inference_1_2.R usw.

Das letzte, was ich tun möchte, wird dann alle 57 Skripte von meinem Meister ausführen und gleichzeitig. Ich habe folgendes in der for-Schleife versucht:

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

Dies funktioniert nicht. Allerdings, wenn ich eine der 57 generierten Skripte öffnen und führen Sie es dann bekomme ich das gewünschte Ergebnis aus diesem Skript. Dies sagt mir, dass das Problem innerhalb des system() -Befehls liegt, den ich geschrieben habe.

Jede der 57-Skripte werden nicht rechenintensiv (noch) nicht, und der Test sollte ich 2 Minuten auf meinem PC nehmen jetzt tun wollen. Wie kann ich meinen System() Befehl bearbeiten, um alle 57 Skripte gleichzeitig auszuführen?

+0

'sapply (paste0 ("Rscript run_inference _", abc, "_", def ".R"), ein System, warten = F)' Kein Kommentar darüber, ob, wenn Erzeugung und 57 Skript ausgeführt wird, ein gutes Idee oder nicht für dein Problem. – Vlo

+1

Ich stimme Vlos unausgesprochener Sorge zu, dass es wahrscheinlich einen besseren Weg gibt, dies zu tun. Warum möchten Sie die Skripte schreiben, anstatt etwas zu tun, das eine Funktion hat, die die erforderlichen Eingaben macht und diese Funktion nur mit den 57 verschiedenen Eingängen ausführt, die Sie wünschen? – Dason

+0

Ich habe einen gut ausgestatteten PC, der in der Lage sein sollte, sehr intensive Jobs zu bewältigen, und Kollegen, die mit dem parallelen Rechnen vertrauter sind, haben mir gesagt, dass diese Aufgabe machbar sein sollte, wenn man das zur Verfügung hat. Wir werden sehen! – tfmunkey

Antwort

3

Sie tun dies nicht durch system einmal mit einem großen Skript aufrufen, es sei denn, das Programm, das Sie laufen sind weiß, wie das Skript selbst parallelisieren. Sie tun dies, indem system mehrfach aus verschiedenen R Prozesse aufrufen.

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

Danke. Ich werde damit experimentieren und sehen, wie es geht. Das Ausführen von großen Jobs wie diesem ist neu für mich, also ist das eine großartige "Feuertaufe", sozusagen. – tfmunkey

Verwandte Themen