Czy istnieje sposób, w jaki mogę utworzyć alias w R, który będzie wykonywał, q()
a następnie restartował czystą sesję R?
I tak, jestem zbyt leniwy, żeby pisać, q()
a potem list R
:)
Czy istnieje sposób, w jaki mogę utworzyć alias w R, który będzie wykonywał, q()
a następnie restartował czystą sesję R?
I tak, jestem zbyt leniwy, żeby pisać, q()
a potem list R
:)
save
parametru opcji q()
, na przykład "r"
, który uruchamia ponownie R bez zapisywania obszaru roboczego. Wtedy alias dla q("r")
może zostać przypisany do nowej funkcji, która uruchamia ponownie R.
Odpowiedzi:
Jeśli jesteś w RStudio: command / ctrl + shift + F10
Możesz także użyć
.rs.restartR()
.rs.restartR()
nie wydaje się robić żadnej z tych rzeczy na moim komputerze ...
W zależności od tego, jak uruchomiłeś R, spróbuj umieścić jedną z tych linii w swoim .Rprofile
pliku:
makeActiveBinding("refresh", function() { shell("Rgui"); q("no") }, .GlobalEnv)
makeActiveBinding("refresh", function() { system("R"); q("no") }, .GlobalEnv)
Następnie wprowadzając to do konsoli R:
refresh
zamknie bieżącą sesję i uruchomi nową.
.Last <- function() system("R")
nawet później w cyklu wyłączania reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE)
. Potem q()
wraca.
Odkryłem, że .rs.restartR () działa podobnie do naciśnięcia ctrl + shift + F10. ale nie wyładowuj opakowań
getAnywhere(".rs.restartR")
tego wydaje się być w tools:rstudio
. Nie miałem szczęścia, aby uzyskać dostęp do tego w czystej sesji R.
.rs.restartR()
nie rozładowuje paczek, więc nie jest dokładnie tym samym, coctrl+shift+f10
Stary post, ale żadna z odpowiedzi nie działa (u mnie używam Windowsa, innych nie testowałem), więc dodam moje rozwiązanie. Część mojej terminologii może być tutaj błędna, ale to powinno mieć sens:
Powyższe odpowiedzi nie do końca działają
Większość odpowiedzi przesłanych tutaj dotyczy użycia shell
lub system
które nie do końca działają, ponieważ podczas gdy otwierają nową konsolę R i nakazują zamknięcie oryginalnej konsoli, nowa konsola jest procesem działającym w kontekście aplikacji starej konsoli. Oznacza to, że oryginalna konsola nie może się zamknąć, dopóki nowa konsola nie zostanie zamknięta. Niektórzy z powyższych użytkowników, na przykład hedgedandlevered, zgłosili, że zamknięcie oryginalnej konsoli wymusza zamknięcie nowej konsoli. Kiedy próbuję, nowa konsola otwiera się, ale stara konsola pozostaje otwarta w stanie zamrożenia, dopóki nowa konsola nie zostanie zamknięta.
Podstawowym problemem jest dzwonienie shell
lub system
brak zmiany kontekstu aplikacji z oryginalnej konsoli na nową, dlatego oryginalny proces nie może zakończyć się do czasu zamknięcia nowej konsoli.
Alternatywa, która mi pasuje
Zamiast tego użyj tego, shell.exec
co normalnie byłoby używane do otwierania pliku w domyślnej aplikacji na podstawie typu pliku. Gdy jest używany na .exe, najwyraźniej uruchamia plik wykonywalny. Ważną różnicą jest jednak to, że system uruchamia aplikację w swoim własnym, oddzielnym kontekście. Oto kod, który działa dla mnie:
makeActiveBinding("restart.R", function() { shell.exec(paste0(R.home(),"/bin/x64/Rgui.exe")); q("no") }, .GlobalEnv)
Będziesz musiał edytować ścieżkę pliku, /bin/x64/Rgui.exe
aby pasowała do tego, czego używasz do uruchomienia R. Po prostu umieść tę linię w .Rprofile
pliku, a następnie możesz ją wywołać, wprowadzającrestart.R
kod R.
Wadą tego w porównaniu z innymi metodami jest to, że nie możesz przekazywać argumentów wiersza poleceń, tak --no-save
jak w przypadku just shell
, ale przynajmniej pozwoli ci to zamknąć oryginalny proces R.
Szukając rozwiązania tego problemu, rozwiązałem swój problem w oparciu o to rozwiązanie tutaj , używając pakietu R RDCOMClient .
Rozwiązanie poniżej działa po prostu w RStudio (Windows), gdy symuluje naciśnięcia klawiszy ctrl + shift + F10 .
Pakiet RDCOMClient należy zainstalować za pomocą następującego polecenia:
install.packages("RDCOMClient", repos = "http://www.omegahat.net/R")
Kod do symulacji naciśnięć klawiszy w RStudio (Windows 10) to:
library(RDCOMClient)
wsh <- COMCreate("Wscript.Shell")
wsh$SendKeys("^+{F10}")
W ostatnim wierszu powyższego kodu klawisz „ctrl” jest reprezentowany przez „^”, a klawisz Shift przez „+”. Wszystkie wyjaśnienia dotyczące tych kluczowych reprezentacji są dostępne tutaj .
Zgodnie z komentarzem @steadyfish, zaraz po uruchomieniu ostatniej linii powyższego kodu, cała sesja R w RStudio zostanie zresetowana . Oznacza to, że usuwa wszystkie dane z bieżącej sesji i zwalnia wszystkie załadowane pakiety w sesji.
Napisz tę funkcję w swoim .Rprofile
r <- function() {
assign('.Last', function() {system('R')}, envir = globalenv())
quit(save = 'no')
}
r()
uruchamia ponownie sesję R. Wczytane pakiety nie zostaną ponownie załadowane. Twoje środowisko nie zostanie uratowane.
Działa na Linuksie. Nie mam pojęcia, co może się stać w innym systemie operacyjnym
Potrzebowałem tej samej funkcji odświeżania sesji w systemie Windows i otrzymałem nieco zmodyfikowaną wersję kodu:
makeActiveBinding("refresh", function() { shell(paste0("start \"\" \"", R.home(), "/bin/x64/Rgui.exe\"")); q("no") }, .GlobalEnv)
W systemie Windows musisz zmodyfikować Rprofile.site
plik. Znajduje się w etc
katalogu R. Uważaj również na ostatnią część ścieżki, która bin/x64
może ulec zmianie w zależności od konfiguracji systemu. Mam nadzieję, że to pomoże też innym.
Zgodnie z pomysłem Martina Morgana na użycie .Last()
; spowoduje to ponowne uruchomienie R z tym samym zestawem opcji wiersza poleceń, co poprzednio:
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)
}
startup::restart()
do pakietu startowego jako
Myślę, że najlepiej wykorzystać R, ustawiając bieżący katalog roboczy w opcjach. Następnie za każdym razem, gdy plik obszaru roboczego / sesji zacznie się wyświetlać lub ma w nim wystarczającą ilość pracy (między projektami), możesz po prostu zmienić nazwę tego domyślnego pliku sesji w katalogu roboczym po zamknięciu R i R / Rstudio automatycznie uruchomi cię w nowym plik przestrzeni roboczej / sesji, bez zakłócania bieżącej pracy.
Pamiętaj, aby zamknąć R i zmienić nazwę bieżącego pliku sesji
Oczywiście, jeśli nie chcesz zapisywać bieżącej pracy, musisz upewnić się, że zresetowałeś obiekty lub operacje na nich zostały wykonane po skopiowaniu z oryginalnych obiektów, aby były takie, jakie są. Zaufaj mi, świadomość, że zawsze możesz załadować stare obszary robocze, jest pokusą, ale jest bardziej przydatna niż nie.
Krótko mówiąc, wyjdź z R, daje ci trochę luki, podczas gdy zamknięcie oznacza, że ten obszar roboczy jest pełny, zmień jego nazwę po zakończeniu zamykania i uruchom ponownie R / Rstudio z nowym obszarem roboczym. Zawsze możesz wczytać wybrane obiekty w nowym obszarze roboczym. Idealnie, wszystkie ważne prace powinny znajdować się w katalogach projektów, ale nadal potrzebujesz historii swoich zadań, aby czasami wrócić, a zapisane sesje przydadzą się w pewnym momencie, gdy będziesz pracować nad dłuższymi projektami. Jeśli nie potrzebujesz tego po prosturm(list=ls())
Podoba mi się też RDComClient
pomysł @Eduardo Alvin, ale został wycofany.
ALTERNATYWNA OPCJA
Prostą alternatywą, aby pozbyć się bagażu w dowolnym momencie w miejscu pracy, jest użycie save.image
save.image("Rstreamingscience.data")
quit(save='no')
load("Rstreamingscience.data") ##G:/ADA registers##
save.image("Rstreamingscience.data")
Dzięki temu możesz przychodzić i wychodzić, kiedy chcesz, i otwierać tyle obszarów roboczych, ile potrzebujesz.
makeActiveBinding("refresh", function() { system(paste0(R.home(),"/bin/i386/R")); q("no") }, .GlobalEnv)
lub z --save lub --no-save
paste0(R.home(),"/bin/i386/R --no-save")
Myślę, że to jest to, czego potrzebujesz, jeśli użyłeś setwd () przed wywołaniem odświeżania (chociaż ani ta, ani oryginalna wersja nie działa dla mnie, ponieważ uruchamia ponownie R, a następnie zamyka się, nowe okno nigdy nie jest otwierane. Jeśli ktoś może komentować to, zrób to)
Napisałem następującą funkcję. Zapamiętaj! Możesz go użyć tylko raz, a następnie musisz go ponownie załadować po ponownym uruchomieniu sesji 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
}
Czasami pomaga również odłączenie opakowania.
rm(list=ls())
ale nie to masz na myśli, prawda?