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

88

Existe-t-il un moyen de créer un alias, dans R, qui exécutera q()puis redémarrera une session R propre?

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

Justin
la source
Eh bien, vous pouvez effacer votre espace de travail avec rm(list=ls())mais ce n'est pas ce que vous voulez dire, n'est-ce pas?
Sacha Epskamp
2
Voulez-vous également détacher les packages et autres éléments que vous avez peut-être joints?
Spacedman
2
Une suggestion serait peut-être d'ajouter un nouveau saveparamètre d' option à q(), tel que "r", qui redémarre R sans enregistrer l'espace de travail. Ensuite, un alias pour q("r")pourrait être attribué à une nouvelle fonction qui redémarre R.
Greg

Réponses:

78

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

Vous pouvez aussi utiliser

.rs.restartR()
mgoldwasser
la source
12
Je crois que l'ouverture d'une "session R propre" nécessite que 1-Data de la session actuelle soit supprimée; 2-Les packages de la session en cours sont déchargés. .rs.restartR()ne semble faire aucune de ces choses sur ma machine ..
stabilfish
3
Je trouve le .rs.restartR () utile pour les cas où R ne libérerait 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.
Richard DiSalvo
56

En fonction de la façon dont vous démarrez R, essayez de placer l'une de ces lignes dans votre .Rprofilefichier:

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

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

Entrez ensuite ceci dans la console R:

refresh

fermera la session en cours et en démarrera une nouvelle.

G. Grothendieck
la source
4
ou .Last <- function() system("R")ou même plus tard dans le cycle d'arrêt reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE). Puis q()continue de revenir.
Martin Morgan du
1
Assurez-vous que R est sur votre PATH.
G. Grothendieck
2
Cette solution fonctionne mais n'est pas reproductible lorsque mon script est exécuté par d'autres. Y a-t-il une commande à inclure dans le script R pour redémarrer la session R? (la raison étant que je veux que tous les packages soient détachés)
Heisenberg
13

J'ai trouvé que .rs.restartR () fonctionne de manière similaire à appuyer sur ctrl + shift + F10. mais ne pas décharger les colis

Adam Lee Perelman
la source
Fonctionne dans RStudio - mais je ne suis pas sûr qu'il existe un moyen de le faire fonctionner ailleurs. De getAnywhere(".rs.restartR")cela semble être dans tools:rstudio. Je n'ai pas eu la chance d'accéder à cela dans une session R. pure.
Gregor Thomas
11
.rs.restartR()ne décharge pas les paquets, donc ce n'est pas exactement la même chose quectrl+shift+f10
Arthur
5

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

ppanko
la source
Travaux! brillamment!
agent18
4

Ancien message, mais aucune des réponses ne fonctionne vraiment (pour moi, j'utilise Windows, je n'en ai pas testé d'autres), alors j'ajouterai ma solution. Une partie de ma terminologie n'est peut-être pas ici, mais cela devrait faire passer le message:

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

La plupart des réponses soumises ici impliquent l'utilisation shellou systemqui ne fonctionne pas tout à fait car, bien qu'ils ouvrent une nouvelle console R et demandent à la console d'origine de se fermer, la nouvelle console est un processus s'exécutant 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 n'est pas fermée. Certains des utilisateurs ci-dessus, tels que hedgedandlevered, ont signalé que la fermeture de la console d'origine obligeait la nouvelle console à se fermer. Quand j'essaye, la nouvelle console s'ouvre, mais l'ancienne console reste ouverte dans un état gelé jusqu'à ce que la nouvelle console soit fermée.

Le problème de base appelle shellou systemne modifie pas le contexte de l'application de la console d'origine à la nouvelle, et par conséquent le processus d'origine ne peut pas se terminer tant que la nouvelle console n'est pas fermée.

Alternative qui fonctionne pour moi

Utilisez plutôt shell.execce 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, apparemment, il exécute l'exécutable. La différence importante, cependant, est que le système démarre l'application dans son propre contexte distinct. 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.exepour qu'il corresponde à ce que vous utilisez pour démarrer R. Vous venez de mettre cette ligne dans votre .Rprofilefichier, puis vous pouvez l'appeler en entrant restart.Rvotre code R.

L'inconvénient de cela par rapport aux autres méthodes est que vous ne pouvez pas passer d'arguments de ligne de commande --no-savecomme vous le feriez avec juste shell, mais au moins cela vous permettra de fermer le processus R d'origine.

Matthieu
la source
4

Après avoir cherché une solution à cela, j'ai résolu mon problème en me basant sur cette solution ici , en utilisant le package R RDCOMClient .
La solution ci-dessous fonctionne simplement dans RStudio (Windows), une fois qu'elle simule les pressions sur les touches ctrl + shift + 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 sur les touches dans RStudio (Windows 10) est:

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 Maj par «+». Toutes les explications de ces représentations clés sont disponibles ici .

Juste après avoir exécuté la dernière ligne du code ci-dessus, toute la session R dans RStudio sera réinitialisée, selon le commentaire de @steadyfish . Autrement dit, il supprime toutes les données de la session en cours et décharge tous les packages chargés dans la session.

Eduardo Alvim
la source
2

Écrivez cette fonction dans votre .Rprofile

r <- function() {
  assign('.Last',  function() {system('R')}, envir = globalenv())
  quit(save = 'no')
}

r()redémarre votre session R. Les packages chargés ne se rechargeront pas. Votre environnement ne sera pas sauvegardé.

Fonctionne pour Linux. Aucune idée de ce qui peut arriver sur d'autres OS

Andrea
la source
1

J'avais besoin de la même fonctionnalité de session d'actualisation sur 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 Rprofile.sitefichier. C'est sous le etcrépertoire de R. Attention également à la dernière partie du chemin qui bin/x64peut changer en fonction de la configuration de votre système. J'espère que cela aidera les autres aussi.

mron
la source
1

Conformément à 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)
}
HenrikB
la source
2
FYI, j'ai ajouté startup::restart()au package de démarrage comme un moyen
convenint
1

Je pense que l'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 / session commence à vous montrer ou en a assez de votre travail (entre les 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 démarrera automatiquement dans un nouveau 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 souhaitez pas enregistrer le travail en cours, vous devez vous assurer que vous réinitialisez les objets ou que les opérations sur eux ont été effectuées après la copie à partir des objets d'origine afin qu'ils soient tels quels. Croyez-moi, savoir que vous pouvez toujours charger les anciens espaces de travail est une tentation, mais c'est plus utile que pas.

En bref, quittez R, cela vous laisse un espace pendant que vous quittez signifie que cet espace de travail est plein, renommez-le après avoir terminé la fermeture et redémarrez 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 se trouver dans les répertoires de projet, mais vous avez toujours besoin d'un historique de vos travaux pour y revenir et les sessions enregistrées sont utiles à un moment donné une fois que vous êtes sur des projets plus longs. Si vous n'en avez besoin querm(list=ls())

Aussi, j'aime l' RDComClientidée 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 est d'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 nécessaire.

Suntropical
la source
0
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 fonctionnent pour moi, puisqu'elle redémarre R puis se ferme, une nouvelle fenêtre n'est jamais ouverte. Si quelqu'un peut commenter sur ceci, s'il vous plaît faites-le)

couvert et renforcé
la source
quand j'essaye ceci, une nouvelle fenêtre est ouverte, mais l'ancienne fenêtre est maintenue ouverte dans un état gelé jusqu'à ce que la nouvelle fenêtre soit fermée
Matthieu
0

J'ai écrit la fonction suivante. Rappelles toi! 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, le détachement d'un package aide également.

Adam Lee Perelman
la source