2017-09-22 10 views
2

le système() Je suis en cours d'exécution rstudio dans Windows 7. J'ai écrit un script maître qui génère 57 nouveaux scripts R, chacun avec des commandes pour exécuter une fonction basée sur deux paramètres:L'exécution de plusieurs scripts R en utilisant la commande

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

d'abord, le script maître utilise deux boucles for (un à l'aide de l'index 'abc' pour vector1, l'un à l'aide de l'indice 'def' pour vector2) pour générer chacun des 57 scripts dans mon répertoire de travail qui prennent la convention de nom de fichier suivante:

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

Cette partie s'exécute avec succès - chacun des 57 scripts est généré avec les commandes correctes à l'intérieur. Mon répertoire de travail contient maintenant les fichiers run_inference_1_1.R, run_inference_1_2.R, etc.

La dernière chose que je veux faire est de lancer ensuite tous les 57 scripts de mon maître, et en même temps. J'ai essayé ce qui suit à l'intérieur de la boucle for:

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

Cela ne fonctionne pas. Cependant, si j'ouvre l'un des 57 scripts générés et que je l'exécute, j'obtiens le résultat souhaité de ce script. Cela me dit que le problème est dans la commande system() que j'ai écrite.

Chacun des 57 scripts ne sera pas (encore) intensif en calcul, et le test que je veux faire maintenant devrait prendre 2 minutes sur mon PC. Comment puis-je modifier ma commande system() pour exécuter les 57 scripts simultanément, s'il vous plaît?

+0

'sapply (paste0 ("RSCRIPT run_inference _", abc, "_", def, ".R"), système, attendez = F)' Aucun commentaire si si la production et l'exécution 57 script est un bon idée ou non pour votre problème. – Vlo

+1

Je fais écho à l'inquiétude tacite de Vlo selon laquelle il y a probablement une meilleure façon de le faire. Pourquoi voulez-vous écrire les scripts au lieu de faire quelque chose comme avoir une fonction qui prend l'entrée requise et exécute juste cette fonction avec les 57 entrées différentes que vous désirez? – Dason

+0

J'ai un PC bien doté qui devrait être capable de gérer des tâches très intensives, et des collègues plus familiers avec l'informatique parallèle m'ont dit que cette tâche devrait être faisable étant donné ce qui est disponible. Nous verrons! – tfmunkey

Répondre

3

Vous ne le faites pas en appelant une fois system avec un gros script, sauf si le programme que vous exécutez sait comment paralléliser le script lui-même. Pour ce faire, appelez le system plusieurs fois à partir de différents processus R.

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

Merci. Je vais expérimenter avec cela et voir comment ça se passe. Exécuter de gros travaux comme celui-ci est nouveau pour moi, donc c'est un grand «baptême de feu», pour ainsi dire. – tfmunkey