100 votes

Quitter et redémarrer une session R propre à partir de R ?

Y a-t-il un moyen de créer un alias, dans R, qui exécutera q() et ensuite redémarrer une session R propre ?

Et oui, je suis trop paresseux pour taper. q() et ensuite la lettre R :)

0 votes

Eh bien, vous pouvez vider votre espace de travail avec rm(list=ls()) mais ce n'est pas ce que vous voulez dire, n'est-ce pas ?

2 votes

Voulez-vous également détacher tous les paquets et autres choses que vous avez pu attacher ?

2 votes

Une suggestion serait peut-être d'ajouter une nouvelle option save pour q() tels que "r" qui redémarre R sans sauvegarder l'espace de travail. Ensuite, un alias pour q("r") pourrait être affecté à une nouvelle fonction qui redémarre R.

91voto

mgoldwasser Points 377

Si vous êtes dans RStudio : command/ctrl + shift + F10

Vous pouvez également utiliser

.rs.restartR()

15 votes

Je crois que l'ouverture d'une "session R propre" nécessite que 1-Les données de la session actuelle soient supprimées ; 2-Les paquets de la session actuelle soient déchargés. .rs.restartR() ne semble pas faire l'une ou l'autre de ces choses sur ma machine

3 votes

Je trouve le .rs.restartR() utile pour les cas où R ne libère pas de mémoire même après remove(list=ls()) ; gc() ;. Cela libère définitivement la mémoire. J'aime aussi le fait qu'il ne détache pas les paquets.

61voto

G. Grothendieck Points 40825

Selon la façon dont vous démarrez R essayez de placer une de ces lignes dans votre .Rprofile fichier :

makeActiveBinding("refresh", function() { shell("Rgui"); q("no") }, .GlobalEnv)

makeActiveBinding("refresh", function() { system("R"); q("no") }, .GlobalEnv)

Puis en entrant ceci dans la console R :

refresh

fermera la session en cours et en lancera une nouvelle.

4 votes

Ou .Last <- function() system("R") ou même plus tard dans le cycle d'arrêt reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE) . Ensuite, q() ne cesse de revenir.

1 votes

Assurez-vous que R est dans votre PATH.

2 votes

Cette solution fonctionne mais n'est pas reproductible lorsque mon script est exécuté par d'autres personnes. Existe-t-il une commande à inclure dans le script de R pour relancer la session R ? (la raison étant que je veux que tous les paquets soient détachés)

16voto

Adam Lee Perelman Points 651

J'ai trouvé que .rs.restartR() fonctionne de la même manière que ctrl+shift+F10, mais ne décharge pas les paquets.

0 votes

Cela fonctionne dans RStudio - mais je ne suis pas sûr qu'il y ait un moyen de le faire fonctionner ailleurs. De getAnywhere(".rs.restartR") il semble être dans tools:rstudio . Je n'ai pas eu la chance d'y accéder dans une session de R pur.

11 votes

.rs.restartR() ne décharge pas les paquets, il n'est donc pas exactement la même chose que ctrl+shift+f10

11voto

ppanko Points 154

Comme autre alternative, Emacs ESS (>= 16.10) peut recharger le processus R inférieur via inferior-ess-r-reload-hook qui est lié à C-c C-e C-r par défaut.

0 votes

Fonctionne ! brillamment !

5voto

Matthew Points 2018

Vieux post, mais aucune des réponses ne fonctionne (pour moi, j'utilise Windows, je n'ai pas testé les autres), donc je vais ajouter ma solution. Il se peut que ma terminologie soit erronée, mais elle devrait permettre de faire passer le message :

Les réponses ci-dessus ne fonctionnent pas tout à fait

La plupart des réponses soumises ici impliquent l'utilisation shell o system ce qui ne fonctionne pas tout à fait car, bien qu'ils ouvrent une nouvelle console R et demandent à la console originale de se fermer, la nouvelle console est un processus exécuté dans le contexte d'application de l'ancienne console. Cela signifie que la console d'origine ne peut pas se fermer tant que la nouvelle console ne se ferme pas. Certains des utilisateurs ci-dessus, comme Hedgedandlever, ont signalé que la fermeture de la console d'origine force la fermeture de la nouvelle console. Lorsque j'essaie, la nouvelle console s'ouvre, mais l'ancienne console reste ouverte dans un état figé jusqu'à ce que la nouvelle console soit fermée.

Le problème de base est d'appeler shell o system ne change pas le contexte de l'application de la console d'origine à la nouvelle, et donc le processus d'origine ne peut pas se terminer avant la fermeture de la nouvelle console.

Alternative qui fonctionne pour moi

Utilisez plutôt shell.exec qui serait normalement utilisé pour ouvrir un fichier dans l'application par défaut en fonction du type de fichier. Lorsqu'il est utilisé sur un .exe, il exécute apparemment l'exécutable. La différence importante, cependant, est que le système lance l'application dans son propre contexte séparé. Voici donc le code qui fonctionne pour moi :

makeActiveBinding("restart.R", function() { shell.exec(paste0(R.home(),"/bin/x64/Rgui.exe")); q("no") }, .GlobalEnv)

Vous devrez modifier le chemin du fichier /bin/x64/Rgui.exe pour correspondre à ce que vous utilisez pour démarrer R. Il suffit de mettre cette ligne dans votre .Rprofile puis vous pouvez l'appeler en entrant restart.R dans votre code R.

L'inconvénient de cette méthode par rapport aux autres est que vous ne pouvez pas passer des arguments de ligne de commande comme --no-save comme vous le feriez avec juste shell mais au moins cela vous permettra de fermer le processus R original.

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