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
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:
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ń
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 .
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:
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.
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:
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.
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.
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)
}
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
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)
rm(list=ls())
ale nie to masz na myśli, prawda?save
parametru opcjiq()
, na przykład"r"
, który uruchamia ponownie R bez zapisywania obszaru roboczego. Wtedy alias dlaq("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ć
źródło
.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:
zamknie bieżącą sesję i uruchomi nową.
źródło
.Last <- function() system("R")
nawet później w cyklu wyłączaniareg.finalizer(.GlobalEnv, function(e) system("R"), TRUE)
. Potemq()
wraca.Odkryłem, że .rs.restartR () działa podobnie do naciśnięcia ctrl + shift + F10. ale nie wyładowuj opakowań
źródło
getAnywhere(".rs.restartR")
tego wydaje się być wtools: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
Jako inna alternatywa, Emacs ESS (> = 16.10) może przeładować gorszy proces R, przez
inferior-ess-r-reload-hook
który jestC-c C-e C-r
domyślnie powiązany .źródło
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
lubsystem
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
lubsystem
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 justshell
, ale przynajmniej pozwoli ci to zamknąć oryginalny proces R.źródło
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.
źródło
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
źródło
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ę wetc
katalogu R. Uważaj również na ostatnią część ścieżki, którabin/x64
może ulec zmianie w zależności od konfiguracji systemu. Mam nadzieję, że to pomoże też innym.źródło
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) }
źródło
startup::restart()
do pakietu startowego jakoMyś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 prostu
rm(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.
źródło
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)
źródło
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.
źródło