J'ai un script R pour lequel j'aimerais pouvoir fournir plusieurs paramètres de ligne de commande (plutôt que des valeurs de paramètres de code dur dans le code lui-même). Le script s'exécute sur Windows.
Je ne trouve pas d'informations sur la façon de lire les paramètres fournis sur la ligne de commande dans mon script R. Je serais surpris si cela ne pouvait pas être fait, alors peut-être que je n'utilise tout simplement pas les meilleurs mots clés dans ma recherche Google ...
Des conseils ou des recommandations?
command-line
r
parameters
monch1962
la source
la source
Réponses:
La réponse de Dirk ici est tout ce dont vous avez besoin. Voici un exemple reproductible minimal.
J'ai fait deux fichiers:
exmpl.bat
etexmpl.R
.exmpl.bat
:Alternativement, en utilisant
Rterm.exe
:exmpl.R
:Enregistrez les deux fichiers dans le même répertoire et démarrez
exmpl.bat
. Dans le résultat, vous obtiendrez:example.png
avec un complotexmpl.batch
avec tout ce qui a été faitVous pouvez également ajouter une variable d'environnement
%R_Script%
:et l'utiliser dans vos scripts batch comme
%R_Script% <filename.r> <arguments>
Différences entre
RScript
etRterm
:Rscript
a une syntaxe plus simpleRscript
choisit automatiquement l'architecture sur x64 (voir Installation et administration de R, 2.6 Sous-architectures pour plus de détails)Rscript
besoinsoptions(echo=TRUE)
dans le fichier .R si vous voulez écrire les commandes dans le fichier de sortiela source
Quelques points:
Les paramètres de ligne de commande sont accessibles via
commandArgs()
, voir donchelp(commandArgs)
pour un aperçu.Vous pouvez utiliser
Rscript.exe
sur toutes les plateformes, y compris Windows. Il soutiendracommandArgs()
. littler pourrait être porté sur Windows mais ne vit actuellement que sur OS X et Linux.Il existe deux modules complémentaires sur CRAN - getopt et optparse - qui ont tous deux été écrits pour l'analyse en ligne de commande.
Edit en novembre 2015: de nouvelles alternatives sont apparues et je recommande sans réserve docopt .
la source
Ajoutez ceci en haut de votre script:
Ensuite, vous pouvez vous référer aux arguments passés comme
args[1]
,args[2]
etc.Exécutez ensuite
Si vos arguments sont des chaînes contenant des espaces, placez-les entre guillemets.
la source
Essayez la bibliothèque (getopt) ... si vous voulez que les choses soient plus belles. Par exemple:
la source
vous avez besoin de plus petit (prononcé «petit r»)
Dirk sera dans environ 15 minutes pour élaborer;)
la source
Puisqu'il
optparse
a été mentionné plusieurs fois dans les réponses et qu'il fournit un kit complet pour le traitement en ligne de commande, voici un bref exemple simplifié de la façon dont vous pouvez l'utiliser, en supposant que le fichier d'entrée existe:script.R:
Étant donné un fichier arbitraire
blah.txt
de 23 lignes.Sur la ligne de commande:
Rscript script.R -h
les sortiesRscript script.R -n blah.txt
les sorties[1] "69"
Rscript script.R -n -f 5 blah.txt
les sorties[1] "115"
la source
En bash, vous pouvez construire une ligne de commande comme celle-ci:
Vous pouvez voir que la variable
$z
est remplacée par bash shell avec "10" et cette valeur est récupérée parcommandArgs
et introduite dansargs[2]
, et la commande rangex=1:10
exécutée par R avec succès, etc.la source
Pour info: il existe une fonction args (), qui récupère les arguments des fonctions R, à ne pas confondre avec un vecteur d'arguments nommé args
la source
Si vous devez spécifier des options avec des drapeaux (comme -h, --help, --number = 42, etc.), vous pouvez utiliser le package R optparse (inspiré de Python): http://cran.r-project.org /web/packages/optparse/vignettes/optparse.pdf .
Au moins, c'est ainsi que je comprends votre question, car j'ai trouvé ce message en recherchant un équivalent de bash getopt, ou perl Getopt, ou python argparse et optparse.
la source
Je viens de mettre en place une belle structure de données et une chaîne de traitement pour générer ce comportement de commutation, aucune bibliothèque nécessaire. Je suis sûr qu'il aura été mis en œuvre de nombreuses fois, et je suis tombé sur ce fil à la recherche d'exemples - pensais que j'y participerais.
Je n'avais même pas particulièrement besoin d'indicateurs (le seul indicateur ici est un mode de débogage, créant une variable que je vérifie comme condition de démarrage d'une fonction en aval
if (!exists(debug.mode)) {...} else {print(variables)})
. Leslapply
instructions de vérification d'indicateur ci-dessous produisent la même chose que:où
args
est la variable lue dans les arguments de la ligne de commande (un vecteur de caractères, équivalent àc('--debug','--help')
lorsque vous les fournissez par exemple)Il est réutilisable pour tout autre indicateur et vous évitez toutes les répétitions, et pas de bibliothèques donc pas de dépendances:
Notez
flag.details
qu'ici, les commandes sont stockées sous forme de chaînes, puis évaluées aveceval(parse(text = '...'))
. Optparse est évidemment souhaitable pour tout script sérieux, mais le code à fonctionnalité minimale est parfois bon aussi.Exemple de sortie:
la source