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
:)
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
:)
save
Parameter 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.
Antworten:
Wenn Sie sich in RStudio befinden: Befehl / Strg + Umschalt + F10
Sie können auch verwenden
.rs.restartR()
.rs.restartR()
scheint keines dieser Dinge auf meiner Maschine zu tun ..
Abhängig davon, wie Sie R starten, versuchen Sie, eine dieser Zeilen in Ihre .Rprofile
Datei 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.
.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.
Ich fand, dass .rs.restartR () ähnlich funktioniert wie Strg + Umschalt + F10. aber entladen Sie die Pakete nicht
getAnywhere(".rs.restartR")
scheint es zu sein tools:rstudio
. Ich hatte kein Glück, in einer reinen R-Sitzung darauf zuzugreifen.
.rs.restartR()
entlädt die Pakete nicht, so ist es nicht genau das gleiche wiectrl+shift+f10
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 shell
oder system
funktionieren 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 shell
oder system
nicht 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.exec
die 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 .Rprofile
Datei ein und können sie durch Eingabe restart.R
Ihres R-Codes aufrufen .
Der Nachteil gegenüber anderen Methoden ist, dass Sie keine Befehlszeilenargumente wie --no-save
bei nur übergeben können shell
, aber zumindest können Sie so den ursprünglichen R-Prozess schließen.
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.
Als weitere Alternative kann Emacs ESS (> = 16.10) den minderwertigen R-Prozess neu laden, über inferior-ess-r-reload-hook
den C-c C-e C-r
standardmäßig gebunden ist .
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
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.site
Datei ändern . Es befindet sich im etc
Verzeichnis von R. Achten Sie auch auf den letzten Teil des Pfads, der bin/x64
sich je nach Systemkonfiguration ändern kann. Ich hoffe das wird auch anderen helfen.
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)
}
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 RDComClient
Idee 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.
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)
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.
rm(list=ls())
löschen, aber das ist nicht das, was Sie meinen, oder?