0
votes

Comment puis-je exécuter des one-liners R depuis le terminal sans quitter R?

Cette question et ses réponses montrent comment ouvrir R depuis votre terminal, évaluer l'expression que vous souhaitez, puis quitter R, le tout sur une seule ligne. La réponse la plus claire est d'ouvrir votre terminal puis d'exécuter R --slave -e 'EXPR' où EXPR est votre expression (par exemple R --slave -e '1+1' ).

Ma question est la suivante: comment puis-je faire tout cela sans quitter R? Autrement dit, je veux, en une seule ligne dans mon terminal, à la fois entrer R et évaluer l'expression que je souhaite. Les réponses "évidentes" comme R '1+1' ou R 1+1 ne fonctionnent pas, renvoyant l'erreur ARGUMENT '1+1' __ignored__ et les abus de Bash tels que R; 1+1 refuse d'évaluer la deuxième expression tant que R n'est pas fermé.


4 commentaires

voulez-vous évaluer l'expression et garder ouvert le processus R nouvellement créé?


C'est impossible. AFAIK, vous ne pouvez pas faire passer R du mode non interactif au mode interactif ou vice versa. Vous devez vous en tenir à celui avec lequel vous commencez. Si vous souhaitez utiliser R de manière interactive mais exécutez du code avant le démarrage de la session, vous pouvez écrire votre code dans un .Rprofile , cd dans son répertoire, puis démarrer R en mode interactif. C'est la seule façon dont je peux penser.


@AbdessabourMtk Oui.


@ekoam même echo "1+1" | R --interactive ne fonctionne pas, il exécute simplement le code et s'arrête. Je pense que votre suggestion est la voie à suivre.


3 Réponses :


0
votes

nouvelle réponse:

créez un script appelé oneplusone.R qui contient 1+1 ; puis exécutez dans le terminal Rscript oneplusone.R Cela renvoie:

cd "C:\Program Files\R\R-4.0.3\bin"
R.exe
> 1+1
[1] 2

ancienne réponse:

Dans mon cas (j'exécute Windows), je ferais ce qui suit:

  1. ouvrir CMD
  2. changez le répertoire en votre dossier R
  3. exécuter R.exe
  4. exécuter n'importe quel code

donc dans CMD:

tester@LAPTOP MINGW64 ~/Documents
$ Rscript oneplusone.R
[1] 2

edit: pour Linux, jetez un œil à: http://www.cureffi.org/2014/01/15/running-r-batch-mode-linux/


4 commentaires

Ce n'est pas une ligne, c'est trois.


Une solution Rscript fonctionnerait-elle pour vous? Ou voulez-vous vraiment taper l'expression sans la prédéfinir dans un fichier R?


J'ai mis à jour ma réponse pour exécuter le code à partir du terminal.


Écrire d'abord mon code dans un document séparé? Allez, c'est évidemment de la triche.



1
votes

En développant la suggestion de @ ekoam, nous arrivons facilement à ce que vous recherchez, je pense:

R_script() {
    cat $1 > .Rprofile # in this case, the first argument is a script
    exec R 
}
# then...
R_script some_script.R # followed by any options you want

Maintenant, utilisez simplement votre nouvel utilitaire R_expr quand vous le souhaitez:

jkix $ R_expr "1+1" 
----------------------------------------------------------------
R version 4.0.2 (2020-06-22) -- "Taking Off Again"
Copyright (C) 2020 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin17.0 (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

[1] 2
[Previously saved workspace restored]

> print("We did it! We're still in R!")

C'est aussi très personnalisable: peut-être avez-vous un script que vous souhaitez exécuter et pas seulement une expression:

# just place this in your .bashrc or .zshrc, etc.
R_expr() {
    # will overwrite your Rprofile each time so use with care.
    echo $1 > .Rprofile 
    exec R
}

L'avantage de ces deux solutions est que votre code transmis s'exécute au moment de l'exécution ET que toutes les variables définies, etc. seront disponibles pour la nouvelle session interactive. Notez également que vous pouvez toujours transmettre des arguments de ligne de commande à R :

R_expr "print('vanilla option used')" --vanilla .

J'espère que cela vous sera utile!


0 commentaires

2
votes

Avec une fonction, vous pouvez redémarrer R automatiquement après avoir utilisé les paramètres:

r() {

   # First execute commands when given
   if [ $# -gt 0 ]; then
      R --slave -e "$*"
   fi

   # Start R 
   R --slave

}    

Après le test, vous pouvez ajouter cette fonction à .bashrc .
J'appelle la fonction r , mais je m'assure que r n'est pas déjà utilisé ou réservé par votre système.
Vous pouvez appeler la fonction avec r 1+1 , r 1 + 1 r "1*2" .
Veuillez noter les guillemets lorsque vous utilisez "1*2" . Sans les guillemets, le shell essaiera de développer les caractères spéciaux et cherchera un fichier "1 * 2". Ce serait bien pire avec des espaces, r 1 * 2 remplacera * par beaucoup de noms de fichiers.


8 commentaires

J'aime ça. Que font exactement $ # et $ *? Demander ma propre édification :)


$# = nr d'arguments. -gt (supérieur alors) recherche au moins 1 argument. $* = tous les aguments. Donc, avec l'appel r 1+1 vous avez $#=1 , $1=1+1 et $*=1+1 . Avec l'appel r 1 + 1 vous avez $#=3 , $1=1 et $*=1 + 1 . Avec r vous avez $#=0 et vous sauterez la partie avec -e .


Bug très étrange: taper ? dans mon terminal ouvre R, même après avoir supprimé le code dans .bashrc


Deux problèmes: 1. La fonction r est chargée dans la mémoire, la suppression du code de .bashrc ne fonctionne qu'après le démarrage d'un nouveau shell (vous pouvez utiliser unset r pour supprimer la fonction de la mémoire). 2. Le ? est un joker. Je pense que vous avez un fichier appelé r . Lorsque vous tapez echo ? vous verrez les noms de fichiers avec 1 caractère. Lorsque le premier fichier est r , le shell essaiera d'exécuter r .


@WalterA echo ? renvoie R


Quand echo ? renvoie R , vous avez R dans le répertoire courant. Essayez-le dans un autre répertoire.


Essayé ailleurs et il est seulement revenu?


Juste un rappel amical. Il y a un problème avec cette approche. Si vous exécutez le code puis redémarrez R, les résultats / variables générés dans la première session ne seront pas reportés dans la seconde. Ils seront perdus.