Beenden Sie eine saubere R-Sitzung innerhalb von R?


86

Gibt es eine Möglichkeit, innerhalb von R einen Alias ​​zu q()erstellen, der eine saubere R-Sitzung ausführt und anschließend neu startet ?

Und ja, ich bin zu faul um zu tippen q()und dann den Buchstaben R:)


Nun, Sie können Ihren Arbeitsbereich mit rm(list=ls())löschen, aber das ist nicht das, was Sie meinen, oder?
Sacha Epskamp

2
Möchten Sie auch Pakete und andere Dinge entfernen, die Sie möglicherweise angehängt haben?
Spacedman

2
Vielleicht eine Anregung eine neue Option hinzuzufügen wäre saveParameter q(), wie zum Beispiel "r", dass Neustarts R ohne den Arbeitsbereich zu speichern. Dann könnte ein Alias ​​für q("r")einer neuen Funktion zugewiesen werden, die R.
Greg

Antworten:


75

Wenn Sie sich in RStudio befinden: Befehl / Strg + Umschalt + F10

Sie können auch verwenden

.rs.restartR()

10
Ich glaube, das Öffnen einer "sauberen R-Sitzung" erfordert, dass 1-Daten aus der aktuellen Sitzung entfernt werden. 2-Pakete aus der aktuellen Sitzung werden entladen. .rs.restartR()scheint keines dieser Dinge auf meiner Maschine zu tun ..
Steadyfish

3
Ich finde die .rs.restartR () nützlich für Fälle, in denen R auch nach dem Entfernen keinen Speicher freigeben würde (list = ls ()); gc ();. Dies macht definitiv die Erinnerung frei. Ich mag auch die Tatsache, dass es keine Pakete löst.
Richard DiSalvo

56

Abhängig davon, wie Sie R starten, versuchen Sie, eine dieser Zeilen in Ihre .RprofileDatei einzufügen:

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

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

Geben Sie dies dann in die R-Konsole ein:

refresh

beendet die aktuelle Sitzung und startet eine neue.


4
oder .Last <- function() system("R")oder sogar später im Abschaltzyklus reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE). Dann kommt q()immer wieder zurück.
Martin Morgan

1
Stellen Sie sicher, dass R auf Ihrem Pfad ist.
G. Grothendieck

2
Diese Lösung funktioniert, ist jedoch nicht reproduzierbar, wenn mein Skript von anderen ausgeführt wird. Gibt es einen Befehl, der in das R-Skript aufgenommen werden muss, um die R-Sitzung neu zu starten? (Der Grund dafür ist, dass ich möchte, dass alle Pakete getrennt werden)
Heisenberg

12

Ich fand, dass .rs.restartR () ähnlich funktioniert wie Strg + Umschalt + F10. aber entladen Sie die Pakete nicht


Funktioniert in RStudio - aber ich bin mir nicht sicher, ob es eine Möglichkeit gibt, es irgendwo anders zum Laufen zu bringen. Daraus getAnywhere(".rs.restartR")scheint es zu sein tools:rstudio. Ich hatte kein Glück, in einer reinen R-Sitzung darauf zuzugreifen.
Gregor Thomas

9
.rs.restartR()entlädt die Pakete nicht, so ist es nicht genau das gleiche wiectrl+shift+f10
Arthur

4

Alter Beitrag, aber keine der Antworten funktioniert ganz (für mich verwende ich Windows, habe andere nicht getestet), also werde ich meine Lösung hinzufügen. Einige meiner Begriffe sind hier möglicherweise nicht korrekt, aber dies sollte den Punkt vermitteln:

Die obigen Antworten funktionieren nicht ganz

Die meisten der hier eingereichten Antworten beziehen sich auf die Verwendung shelloder systemfunktionieren nicht ganz, da die neue Konsole zwar geöffnet und die ursprüngliche Konsole zum Schließen angewiesen wird, die neue Konsole jedoch im Anwendungskontext der alten Konsole ausgeführt wird. Das bedeutet, dass die ursprüngliche Konsole erst geschlossen werden kann, wenn die neue Konsole geschlossen wird. Einige der oben genannten Benutzer, wie z. B. Hedgedandlevered, berichteten, dass das Schließen der ursprünglichen Konsole das Schließen der neuen Konsole erzwingt. Wenn ich es versuche, wird die neue Konsole geöffnet, aber die alte Konsole bleibt im eingefrorenen Zustand geöffnet, bis die neue Konsole geschlossen wird.

Das Grundproblem besteht darin, den Anwendungskontext von der ursprünglichen Konsole auf die neue aufzurufen shelloder systemnicht zu ändern. Daher kann der ursprüngliche Prozess erst beendet werden, wenn die neue Konsole geschlossen wird.

Alternative, die für mich funktioniert

Verwenden Sie stattdessen shell.execdie Option, die normalerweise zum Öffnen einer Datei in der Standardanwendung basierend auf dem Dateityp verwendet wird. Bei Verwendung auf einer EXE-Datei wird anscheinend die ausführbare Datei ausgeführt. Der wichtige Unterschied besteht jedoch darin, dass das System die Anwendung in einem eigenen Kontext startet. Hier ist der Code, der für mich funktioniert:

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

Sie müssen den Dateipfad so bearbeiten, dass er mit dem /bin/x64/Rgui.exeübereinstimmt, mit dem Sie R starten. Sie fügen diese Zeile einfach in Ihre .RprofileDatei ein und können sie durch Eingabe restart.RIhres R-Codes aufrufen .

Der Nachteil gegenüber anderen Methoden ist, dass Sie keine Befehlszeilenargumente wie --no-savebei nur übergeben können shell, aber zumindest können Sie so den ursprünglichen R-Prozess schließen.


4

Nachdem ich nach einer Lösung dafür gesucht hatte, löste ich mein Problem basierend auf dieser Lösung hier mit dem R-Paket RDCOMClient .
Die unten stehende Lösung funktioniert nur in RStudio (Windows), sobald die Tastendrücke Strg + Umschalt + F10 simuliert wurden .

Das RDCOMClient-Paket muss mit dem folgenden Befehl installiert werden:

install.packages("RDCOMClient", repos = "http://www.omegahat.net/R")

Der Code zum Simulieren der Tastendrücke in RStudio (Windows 10) lautet:

library(RDCOMClient) 
wsh <- COMCreate("Wscript.Shell") 
wsh$SendKeys("^+{F10}") 

In der letzten Zeile des obigen Codes wird die Strg-Taste durch '^' und die Umschalttaste durch '+' dargestellt. Alle Erklärungen zu diesen Schlüsseldarstellungen finden Sie hier .

Unmittelbar nach dem Ausführen der letzten Zeile des obigen Codes wird die gesamte R-Sitzung in RStudio gemäß dem Kommentar von @steadyfish zurückgesetzt . Das heißt, es werden alle Daten aus der aktuellen Sitzung entfernt und alle geladenen Pakete in der Sitzung entladen.


4

Als weitere Alternative kann Emacs ESS (> = 16.10) den minderwertigen R-Prozess neu laden, über inferior-ess-r-reload-hookden C-c C-e C-rstandardmäßig gebunden ist .


Funktioniert! brillant!
Thej Kiran

2

Schreiben Sie diese Funktion in Ihr .Rprofile

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

r()startet Ihre R-Sitzung neu. Geladene Pakete werden nicht neu geladen. Ihre Umgebung wird nicht gespeichert.

Funktioniert für Linux. Keine Ahnung, was unter anderen Betriebssystemen passieren kann


1

Ich brauchte die gleiche Funktion für Aktualisierungssitzungen unter Windows und erhielt eine leicht modifizierte Version des Codes:

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

Unter Windows müssen Sie die Rprofile.siteDatei ändern . Es befindet sich im etcVerzeichnis von R. Achten Sie auch auf den letzten Teil des Pfads, der bin/x64sich je nach Systemkonfiguration ändern kann. Ich hoffe das wird auch anderen helfen.


1

In Übereinstimmung mit Martin Morgans Idee der Verwendung .Last(); Dadurch wird R mit denselben Befehlszeilenoptionen wie zuvor aufgerufen neu gestartet:

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

1
Zu startup::restart()
Ihrer Information

1

Ich denke, man realisiert die beste Verwendung von R, indem man ein aktuelles Arbeitsverzeichnis in Optionen einstellt. Wenn Ihre Arbeitsbereichs- / Sitzungsdatei Sie dann anzeigt oder genug von Ihrer Arbeit enthält (zwischen Projekten), können Sie diese Standardsitzungsdatei nach dem Schließen von R einfach umbenennen, und R / Rstudio startet Sie automatisch in einer neuen Arbeitsbereich / Sitzungsdatei, ohne Ihre aktuelle Arbeit zu stören.

Denken Sie daran, R zu beenden und die aktuelle Sitzungsdatei umzubenennen

Wenn Sie die aktuelle Arbeit nicht speichern möchten, müssen Sie natürlich sicherstellen, dass Sie Objekte zurücksetzen oder Vorgänge daran ausführen, nachdem Sie von Originalobjekten kopiert haben, so wie sie sind. Vertrauen Sie mir, zu wissen, dass Sie immer die alten Arbeitsbereiche laden können, ist eine Versuchung, aber nützlicher als nicht.

Kurz gesagt, R beenden, gibt Ihnen eine Lücke beim Beenden, was bedeutet, dass dieser Arbeitsbereich voll ist. Benennen Sie ihn nach Abschluss des Beenden um und starten Sie R / Rstudio mit einem neuen Arbeitsbereich neu. Sie können ausgewählte Objekte jederzeit in den neuen Arbeitsbereich laden. Im Idealfall sollten sich alle wichtigen Arbeiten in Projektverzeichnissen befinden, aber Sie benötigen immer noch einen Verlauf Ihrer Jobs, auf den Sie zu bestimmten Zeiten zurückgreifen können, und gespeicherte Sitzungen sind irgendwann nützlich, wenn Sie an längeren Projekten arbeiten. Wenn Sie nichts davon brauchen, nurrm(list=ls())

Ich mag auch die RDComClientIdee von @Eduardo Alvin, aber sie wurde eingestellt.

ALTERNATIVE MÖGLICHKEIT

Eine einfache Alternative, um das Gepäck jederzeit in Ihrem Arbeitsbereich loszuwerden, ist die Verwendung save.image

save.image("Rstreamingscience.data")
quit(save='no')
load("Rstreamingscience.data") ##G:/ADA registers##
save.image("Rstreamingscience.data")

So können Sie kommen und gehen, wie Sie möchten, und so viele Arbeitsbereiche öffnen, wie Sie benötigen.


0
makeActiveBinding("refresh", function() { system(paste0(R.home(),"/bin/i386/R")); q("no") }, .GlobalEnv)

oder mit --save oder --no-save

paste0(R.home(),"/bin/i386/R --no-save")

Ich denke, dies ist das, was Sie brauchen, wenn Sie setwd () verwendet haben, bevor Sie refresh aufrufen (obwohl weder diese noch die Originalversion für mich funktionieren, da es R neu startet und sich dann selbst schließt, wird nie ein neues Fenster geöffnet. Wenn jemand einen Kommentar abgeben kann dies bitte tun)


Wenn ich das versuche, wird ein neues Fenster geöffnet, aber das alte Fenster bleibt in einem eingefrorenen Zustand geöffnet, bis das neue Fenster geschlossen wird
Matthew

0

Ich habe die folgende Funktion geschrieben. Merken! Sie können es nur einmal verwenden, dann müssen Sie es nach dem Neustart der R-Sitzung neu laden.

clc <- function() {
  rm(list = ls(envir = globalenv()),envir = globalenv()) #clear Vars from global enviroment
  gc()  #grabage colector
  cat("\014") #clc
  .rs.restartR() #clear session
}

Manchmal hilft es auch, ein Paket abzunehmen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.