111 votes

Passage d'arguments de ligne de commande à R CMD BATCH

J'ai utilisé R CMD BATCH my_script.R à partir d'un terminal pour exécuter un R script. Je suis maintenant au point où je voudrais passer un argument à la commande, mais j'ai quelques problèmes pour le faire fonctionner. Si je fais R CMD BATCH my_script.R blabla puis blabla devient le fichier de sortie, plutôt que d'être interprété comme un argument disponible pour le script R en cours d'exécution.

J'ai essayé Rscript my_script.R blabla qui semble passer sur blabla correctement comme un argument, mais alors je ne comprends pas la my_script.Rout que j'obtiens avec R CMD BATCH (Je veux le .Rout fichier). Alors que je pourrais rediriger la sortie d'un appel à Rscript à un nom de fichier de mon choix, je n'obtiendrais pas les commandes d'entrée R incluses dans le fichier de la manière dont R CMD BATCH fait dans le .Rout fichier.

Donc, idéalement, je cherche un moyen de passer des arguments à un script R exécuté par l'intermédiaire de l'interface de l'utilisateur. R CMD BATCH mais je serais satisfait d'une approche utilisant la méthode de la Rscript s'il y a un moyen de lui faire produire un résultat comparable. .Rout fichier.

0voto

Dagremu Points 190

Voici une autre façon de traiter les arguments de la ligne de commande, en utilisant R CMD BATCH . Mon approche, qui s'appuie sur une réponse antérieure ici vous permet de spécifier des arguments à la ligne de commande et, dans votre script R, de donner à certains d'entre eux ou à tous des valeurs par défaut.

Voici un fichier R, que je nomme test.R :

defaults <- list(a=1, b=c(1,1,1)) ## default values of any arguments we might pass

## parse each command arg, loading it into global environment
for (arg in commandArgs(TRUE))
  eval(parse(text=arg))

## if any variable named in defaults doesn't exist, then create it
## with value from defaults
for (nm in names(defaults))
  assign(nm, mget(nm, ifnotfound=list(defaults[[nm]]))[[1]])

print(a)
print(b)

À la ligne de commande, si je tape

R CMD BATCH --no-save --no-restore '--args a=2 b=c(2,5,6)' test.R

alors dans R, nous aurons a = 2 y b = c(2,5,6) . Mais je pourrais, disons, omettre b et ajoutez un autre argument c :

R CMD BATCH --no-save --no-restore '--args a=2 c="hello"' test.R

Alors dans R, nous aurons a = 2 , b = c(1,1,1) (par défaut), et c = "hello" .

Enfin, pour plus de commodité, nous pouvons envelopper le code R dans une fonction, à condition de faire attention à l'environnement :

## defaults should be either NULL or a named list
parseCommandArgs <- function(defaults=NULL, envir=globalenv()) {
  for (arg in commandArgs(TRUE))
    eval(parse(text=arg), envir=envir)

  for (nm in names(defaults))
    assign(nm, mget(nm, ifnotfound=list(defaults[[nm]]), envir=envir)[[1]], pos=envir)
}

## example usage:
parseCommandArgs(list(a=1, b=c(1,1,1)))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X