Exécuter le script R à partir de la ligne de commande

484

J'ai un fichier, appelé a.r, il a un chmod755,

sayHello <- function(){
   print('hello')
}

sayHello()

Comment puis-je l'exécuter via la ligne de commande?

Sait
la source
3
Duplication possible de Quelle est la meilleure façon d'utiliser les scripts R sur la ligne de commande?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
5
tl; dr: ajoutez simplement comme première ligne de votre script:#!/usr/bin/env Rscript
michael

Réponses:

671

Si vous souhaitez que la sortie s'imprime sur le terminal, il est préférable d'utiliser Rscript

Rscript a.R

Notez que lorsque vous utilisez R CMD BATCH a.Rcela au lieu de rediriger la sortie vers la sortie standard et d'afficher sur le terminal, un nouveau fichier appelé a.Rout sera créé.

R CMD BATCH a.R
# Check the output
cat a.Rout

Une autre chose à noter à propos de l'utilisation de Rscript est qu'il ne charge pas le methodspackage par défaut, ce qui peut prêter à confusion. Donc, si vous comptez sur tout ce que les méthodes fournissent, vous voudrez le charger explicitement dans votre script.

Si vous voulez vraiment utiliser la ./a.Rfaçon d'appeler le script, vous pouvez ajouter un approprié #!en haut du script

#!/usr/bin/env Rscript
sayHello <- function(){
   print('hello')
}

sayHello()

Je noterai également que si vous utilisez un système * unix, il existe le package littler utile qui fournit une canalisation de ligne de commande facile à R. Il peut être nécessaire d'utiliser littler pour exécuter des applications brillantes via un script? Plus de détails peuvent être trouvés dans cette question .

Dason
la source
28
Sans le #! votre ligne de commande essaie de l'exécuter en tant que script de ligne de commande, en utilisant le même interpréteur qui interprète vos commandes. Il ne sait pas que c'est censé être R, même si le fichier se termine par un suffixe .R ou .r. Le #! indique à la ligne de commande la langue contenue dans le fichier.
Spacedman
4
J'ai pris quelques questions ici au fil des ans et j'ai pu faire référence à la fois à littler et à Rscript. L'essentiel est de dire aux gens, comme vous l'avez fait, c'est R CMD BATCHterrible. Tout sauf ça ...
Dirk Eddelbuettel
@Dason Je travaille également avec le script R et j'essaie d'exécuter le script R à partir du programme Java et je vois une erreur. Voici ma question . Voyez si vous pouvez aider. J'utilise votre exemple de fonction bonjour pour l'instant pour le rendre simple.
user1950349
Existe-t-il un moyen de modifier le chemin d'accès à la bibliothèque dans la commande elle-même? Quelque chose de similaire àR CMD INSTALL -l ~/R/lib-dev
mikemtnbikes
@mikemtnbikes Pas que je sache. On pourrait toujours ajouter quelque chose pour changer le .libPaths () à l'intérieur du script. Mais je ne vois aucune option comme celle indiquée dans la page de manuel de Rscript.
Dason
107

Cela ne répond pas directement à la question. Mais quelqu'un peut se retrouver ici parce qu'il veut exécuter une seule ligne de R à partir du terminal. Par exemple, si vous voulez simplement installer des paquets manquants et quitter, cet oneliner peut être très pratique. Je l'utilise beaucoup lorsque je découvre soudainement que certains packages me manquent et que je veux les installer où je veux.

  • Pour installer à l'emplacement par défaut:

    R -e 'install.packages(c("package1", "package2"))'
  • Pour installer à un emplacement qui nécessite des rootprivilèges:

    R -e 'install.packages(c("package1", "package2"), lib="/usr/local/lib/R/site-library")' 
biocyberman
la source
5
Pour exécuter une commande, vous pouvez également utiliser Rscript -e "getwd()"dans le terminal. Rscript imprime uniquement la sortie de la commande et non le message de démarrage R complet.
Paul Rougieux
Vous pouvez également l'utiliser r -e "cat(getwd(),'\n')"si vous avez installé littler. Dans cette réponse, Dirk Eddelbuettel explique la différence entre littler et Rscript.
Paul Rougieux
2
Merci d'avoir anticipé mon problème! J'avais besoin d'une dernière chose:R -e 'install.packages("package", repos="http://cran.us.r-project.org")'
Erin
4
Il faut utiliser R -r 'options(warn=2); install...'pour arrêter l'exécution et obtenir un code d'erreur non nul en cas d'échec de l'installation. Sinon, les install.packageserreurs ne sont que des avertissements.
rvernica
21

Vous avez besoin de la ?Rscriptcommande pour exécuter un script R à partir du terminal.

Consultez http://stat.ethz.ch/R-manual/R-devel/library/utils/html/Rscript.html

Exemple

## example #! script for a Unix-alike

#! /path/to/Rscript --vanilla --default-packages=utils
args <- commandArgs(TRUE)
res <- try(install.packages(args))
if(inherits(res, "try-error")) q(status=1) else q()
Mehul Rathod
la source
Ce n'était qu'un exemple de la façon dont vous écririez / exécuter un script R, dans votre fichier, ajoutez le #! / Chemin / à / rscript puis chmod + x <votre script.r> et ./<votre script.r>
Mehul Rathod
10

Comment exécuter Rmd dans la commande avec knitr et rmarkdown par plusieurs commandes, puis télécharger un fichier HTML sur RPubs

Voici un exemple: chargez deux bibliothèques et exécutez une commande R

R -e 'library("rmarkdown");library("knitr");rmarkdown::render("NormalDevconJuly.Rmd")'

R -e 'library("markdown");rpubsUpload("normalDev","NormalDevconJuly.html")'
Shicheng Guo
la source
3
Notez qu'il sera plus simple de sauter le chargement de la bibliothèque; R -e 'markdown::rpubsUpload("normalDev","NormalDevconJuly.html")'
gregmacfarlane
3

Une autre façon d'utiliser Rscript pour les systèmes * Unix est la substitution de processus .

Rscript <(zcat a.r)
# [1] "hello"

Ce qui fait évidemment la même chose que la réponse acceptée, mais cela vous permet de manipuler et d'exécuter votre fichier sans lui faire économiser la puissance de la ligne de commande, par exemple:

Rscript <(sed s/hello/bye/ a.r)
# [1] "bye"

Similaire à Rscript -e "Rcode"cela permet également d'exécuter sans enregistrer dans un fichier. Il pourrait donc être utilisé en conjonction avec des scripts qui génèrent du code R, par exemple:

Rscript <(echo "head(iris,2)")
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
Sebastian Müller
la source
3

Juste pour la documentation, vous devez parfois exécuter le script en tant que sudo:

sudo Rscript path/to/your/file.R
Cro-Magnon
la source
2
Quand faut-il faire ça?
simplegamer