Zakończyć i ponownie uruchomić czystą sesję języka R z poziomu R?

88

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

Justin
źródło
Cóż, możesz wyczyścić swój obszar roboczy, rm(list=ls())ale nie to masz na myśli, prawda?
Sacha Epskamp
2
Czy chcesz również odłączyć jakieś paczki i inne rzeczy, które mogłeś dołączyć?
Spacedman
2
Być może jedną z sugestii byłoby dodanie nowego saveparametru 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.
Greg

Odpowiedzi:

78

Jeśli jesteś w RStudio: command / ctrl + shift + F10

Możesz także użyć

.rs.restartR()
mgoldwasser
źródło
12
Uważam, że otwarcie „czystej sesji R” wymaga usunięcia 1-Data z bieżącej sesji; 2-pakiety z bieżącej sesji są wyładowywane. .rs.restartR()nie wydaje się robić żadnej z tych rzeczy na moim komputerze ...
steadyfish
3
Uważam, że .rs.restartR () jest przydatny w przypadkach, w których R nie zwolniłby pamięci nawet po usunięciu (list = ls ()); gc () ;. To zdecydowanie uwalnia pamięć. Podoba mi się też to, że nie odłącza pakietów.
Richard DiSalvo
56

W zależności od tego, jak uruchomiłeś R, spróbuj umieścić jedną z tych linii w swoim .Rprofilepliku:

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ą.

G. Grothendieck
źródło
4
lub .Last <- function() system("R")nawet później w cyklu wyłączania reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE). Potem q()wraca.
Martin Morgan
1
Upewnij się, że R znajduje się na Twojej ścieżce.
G. Grothendieck
2
To rozwiązanie działa, ale nie można go odtworzyć, gdy mój skrypt jest uruchamiany przez innych. Czy w skrypcie języka R jest polecenie ponownego uruchomienia sesji języka R? (powód jest taki, że chcę, aby wszystkie pakiety zostały odłączone)
Heisenberg
13

Odkryłem, że .rs.restartR () działa podobnie do naciśnięcia ctrl + shift + F10. ale nie wyładowuj opakowań

Adam Lee Perelman
źródło
Działa w RStudio - ale nie jestem pewien, czy istnieje sposób, aby działał w innym miejscu. Z 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.
Gregor Thomas
11
.rs.restartR()nie rozładowuje paczek, więc nie jest dokładnie tym samym, coctrl+shift+f10
Arthur
5

Jako inna alternatywa, Emacs ESS (> = 16.10) może przeładować gorszy proces R, przez inferior-ess-r-reload-hookktóry jest C-c C-e C-rdomyślnie powiązany .

ppanko
źródło
Pracuje! błyszcząco!
agent18
4

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 shelllub systemktó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 systembrak 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.execco 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.exeaby pasowała do tego, czego używasz do uruchomienia R. Po prostu umieść tę linię w .Rprofilepliku, 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-savejak w przypadku just shell, ale przynajmniej pozwoli ci to zamknąć oryginalny proces R.

Mateusz
źródło
4

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.

Eduardo Alvim
źródło
2

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

Andrea
źródło
1

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.siteplik. Znajduje się w etckatalogu R. Uważaj również na ostatnią część ścieżki, która bin/x64może ulec zmianie w zależności od konfiguracji systemu. Mam nadzieję, że to pomoże też innym.

mron
źródło
1

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)
}
HenrikB
źródło
2
FYI, dodałem startup::restart()do pakietu startowego jako
wygodny
1

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.

Suntropical
źródło
0
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)

hedgedandlevered
źródło
kiedy próbuję, otwiera się nowe okno, ale stare okno pozostaje otwarte w stanie zamrożonym, dopóki nowe okno nie zostanie zamknięte
Matthew
0

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.

Adam Lee Perelman
źródło