Est-il possible de créer un alias dans R qui exécute q()
et redémarre une session R vierge?
Et oui, je suis trop paresseux pour taper q()
puis la lettre R
:)
Si vous êtes dans RStudio: Commande/ctrl + shift + F10
Vous pouvez aussi utiliser
.rs.restartR()
En fonction de la manière dont vous démarrez R, essayez d’insérer l’une de ces lignes dans votre fichier .Rprofile
:
makeActiveBinding("refresh", function() { Shell("Rgui"); q("no") }, .GlobalEnv)
makeActiveBinding("refresh", function() { system("R"); q("no") }, .GlobalEnv)
Puis entrez ceci dans la console R:
refresh
ferme la session en cours et en démarre une nouvelle.
J'ai trouvé que .rs.restartR () fonctionne simplement en appuyant sur Ctrl + Maj + F10.
Ancien post, mais aucune des réponses ne fonctionne (pour moi, j'utilise Windows, je n'ai pas testé les autres), je vais donc ajouter ma solution. Une partie de ma terminologie est peut-être hors de propos, mais cela devrait faire comprendre:
Les réponses ci-dessus ne fonctionnent pas très bien
La plupart des réponses soumises ici impliquent l’utilisation de Shell
ou system
qui ne fonctionne pas très bien car lorsqu’ils ouvrent une nouvelle console R et ordonnent la fermeture de la console d’origine, 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 avant la fermeture de la nouvelle console. Certains des utilisateurs ci-dessus, tels que hedgedandlevered, ont indiqué 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 l'état bloqué jusqu'à la fermeture de la nouvelle console.
Le problème de base est que l'appel de Shell
ou system
ne modifie pas le contexte de l'application de la console d'origine à la nouvelle et que, par conséquent, 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 fichier .exe, il exécute apparemment l'exécutable. La différence importante, cependant, est que le système démarre l'application dans son propre contexte séparé. Alors voici le code qui fonctionne pour moi:
makeActiveBinding("restart.R", function() { Shell.exec(paste0(R.home(),"/bin/x64/Rgui.exe")); q("no") }, .GlobalEnv)
Vous devrez éditer le chemin du fichier /bin/x64/Rgui.exe
pour qu'il corresponde à ce que vous utiliserez au début de R. Il vous suffit de mettre cette ligne dans votre fichier .Rprofile
, puis de l'appeler en entrant restart.R
dans votre code R.
L'inconvénient de cette méthode par rapport aux autres méthodes est que vous ne pouvez pas passer d'arguments de ligne de commande tels que --no-save
comme vous le feriez avec Shell
, mais au moins, cela vous permettra de fermer le processus R d'origine.
Après avoir cherché une solution à ce problème, j’ai résolu mon problème sur la base de cette solution ici , à l’aide du package R RDCOMClient.
La solution ci-dessous ne fonctionne que dans RStudio (Windows), une fois les touches simulées, Ctrl + Maj + F10.
Le package RDCOMClient doit être installé avec la commande ci-dessous:
install.packages("RDCOMClient", repos = "http://www.omegahat.net/R")
Le code pour simuler les pressions de touches dans RStudio (Windows 10) est le suivant:
library(RDCOMClient)
wsh <- COMCreate("Wscript.Shell")
wsh$SendKeys("^+{F10}")
Dans la dernière ligne du code ci-dessus, la touche "ctrl" est représentée par "^" et la touche majuscule par "+". Toutes les explications sur cette représentation sont disponibles ici .
Juste après avoir exécuté la dernière ligne du code ci-dessus, l’ensemble de la session R dans RStudio sera réinitialisé, conformément au commentaire de @steadyfish . En d’autres termes, il supprime toutes les données de la session en cours et décharge tous les packages chargés dans la session.
Je pense, on réalise la meilleure utilisation de R en définissant un répertoire de travail courant dans les options. Ensuite, chaque fois que votre fichier d'espace de travail/de session commence à s'afficher ou contient suffisamment de travail (entre projets), vous pouvez simplement renommer ce fichier de session par défaut dans le répertoire de travail après la fermeture de R et R/Rstudio vous lancera automatiquement dans un nouveau répertoire. espace de travail/fichier de session, sans perturber votre travail actuel.
N'oubliez pas de quitter R et de renommer le fichier de session en cours
Bien sûr, si vous ne voulez pas sauvegarder le travail en cours, vous devez vous assurer de réinitialiser les objets ou d’effectuer leurs opérations après la copie des objets originaux afin qu’ils soient tels quels. Faites-moi confiance, sachant que vous pouvez toujours charger les anciens espaces de travail est une tentation mais est plus utile que non.
En résumé, quitter R vous laisse un peu de marge, ce qui signifie que cet espace de travail est saturé, renommez-le une fois l'opération terminée et relancez R/Rstudio avec un nouvel espace de travail. Vous pouvez toujours charger des objets sélectionnés dans le nouvel espace de travail. Idéalement, tous les travaux importants doivent figurer dans les répertoires de projet, mais vous avez toujours besoin d'un historique de vos travaux sur lequel vous pouvez parfois revenir. Les sessions enregistrées s'avèrent utiles à un moment donné lorsque vous travaillez sur des projets plus longs. Si vous n'en avez pas besoin, rm(list=ls())
J'aime aussi l'idée RDComClient
de @Eduardo Alvin, mais elle a été abandonnée.
OPTION ALTERNATIVE
Une alternative simple pour vous débarrasser des bagages à tout moment dans votre espace de travail consiste à utiliser save.image
save.image("Rstreamingscience.data")
quit(save='no')
load("Rstreamingscience.data") ##G:/ADA registers##
save.image("Rstreamingscience.data")
Cela vous laisse libre d'aller et venir à votre guise et d'ouvrir autant d'espaces de travail que vous besoin.
J'avais besoin de la même fonctionnalité d'actualisation de session sous Windows et je me suis retrouvé avec une version légèrement modifiée du code:
makeActiveBinding("refresh", function() { Shell(paste0("start \"\" \"", R.home(), "/bin/x64/Rgui.exe\"")); q("no") }, .GlobalEnv)
Sous Windows, vous devez modifier le fichier Rprofile.site
. Il se trouve dans le répertoire etc
de R. Surveillez également la dernière partie du chemin que le bin/x64
peut changer en fonction de la configuration de votre système. J'espère que cela aidera les autres aussi.
Autre solution, 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.
makeActiveBinding("refresh", function() { system(paste0(R.home(),"/bin/i386/R")); q("no") }, .GlobalEnv)
ou avec --save ou --no-save
paste0(R.home(),"/bin/i386/R --no-save")
Je pense que c’est ce dont vous avez besoin si vous avez utilisé setwd () avant d’appeler refresh (bien que ni celle-ci ni la version originale ne me conviennent, puisqu’il redémarre, puis se ferme, une nouvelle fenêtre ne s’ouvre jamais. Si quelqu'un peut commenter ceci, s'il vous plaît faites-le)
En accord avec l'idée de Martin Morgan d'utiliser .Last()
; cela redémarre R avec le même ensemble d'options de ligne de commande que précédemment appelé:
restart_r <- function(status = 0, debug = TRUE) {
if (debug) message("restart_r(): Customizing .Last() to relaunch R ...")
assign(".Last", function() {
args <- commandArgs()
system2(args[1], args = args[-1])
}, envir = globalenv())
if (debug) message("restart_r(): Quitting current R session and starting a new one ...")
quit(save = "no", status = status, runLast = TRUE)
}
J'ai écrit la fonction suivante . Vous ne pouvez l'utiliser qu'une seule fois, puis vous devez le recharger après le redémarrage de la session R.
clc <- function() {
rm(list = ls(envir = globalenv()),envir = globalenv()) #clear Vars from global enviroment
gc() #grabage colector
cat("\014") #clc
.rs.restartR() #clear session
}
Parfois, détacher un paquet aide aussi.