web-dev-qa-db-fra.com

Quittez et redémarrez une session R vierge à partir de R?

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 :)

66
justin

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

Vous pouvez aussi utiliser

.rs.restartR()
57
mgoldwasser

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.

50
G. Grothendieck

J'ai trouvé que .rs.restartR () fonctionne simplement en appuyant sur Ctrl + Maj + F10.

7
Adam Lee Perelman

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.

4
Matthew

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. 

4
Eduardo Alvim

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.

1
Suntropical

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.

1
mron

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.

1
ppanko
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)

0
hedgedandlevered

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)
}
0
HenrikB

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.

0
Adam Lee Perelman