Keluar dan mulai ulang sesi R bersih dari dalam R?

88

Apakah ada cara saya dapat membuat alias, dalam R, yang akan mengeksekusi q()dan kemudian memulai kembali sesi R yang bersih?

Dan ya, saya terlalu malas untuk mengetik q()dan kemudian huruf R:)

justin
sumber
Anda bisa membersihkan ruang kerja Anda dengan rm(list=ls())tapi bukan itu yang Anda maksud kan?
Sacha Epskamp
2
Apakah Anda juga ingin melepaskan semua paket dan barang lain yang mungkin telah Anda lampirkan?
Spacedman
2
Mungkin satu saran adalah menambahkan saveparameter opsi baru ke q(), seperti "r", yang memulai ulang R tanpa menyimpan ruang kerja. Kemudian alias untuk q("r")dapat ditetapkan ke fungsi baru yang memulai ulang R.
Greg

Jawaban:

79

Jika Anda berada di RStudio: command / ctrl + shift + F10

Anda juga bisa menggunakan

.rs.restartR()
mgoldwasser.dll
sumber
12
Saya percaya membuka "sesi R bersih" mengharuskan 1-Data dari sesi saat ini dihapus; 2-Paket dari sesi saat ini dibongkar. .rs.restartR()tampaknya tidak melakukan salah satu dari hal ini di mesin saya ..
steadyfish
3
Saya menemukan .rs.restartR () berguna untuk kasus-kasus di mana R tidak akan membebaskan memori bahkan setelah menghapus (list = ls ()); gc () ;. Ini pasti membebaskan memori. Saya juga menyukai kenyataan bahwa itu tidak melepaskan paket.
Richard DiSalvo
57

Bergantung pada bagaimana Anda memulai R, coba tempatkan salah satu baris ini ke dalam .Rprofilefile Anda :

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

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

Kemudian masukkan ini ke konsol R:

refresh

akan menutup sesi saat ini dan memulai sesi baru.

G. Grothendieck
sumber
4
atau .Last <- function() system("R")bahkan nanti dalam siklus shutdown reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE). Kemudian q()terus kembali.
Martin Morgan
1
Pastikan R ada di PATH Anda.
G. Grothendieck
2
Solusi ini berfungsi tetapi tidak dapat direproduksi ketika skrip saya dijalankan oleh orang lain. Apakah ada perintah untuk dimasukkan dalam skrip R untuk memulai kembali sesi R? (alasannya adalah saya ingin semua paket dilepaskan)
Heisenberg
13

Saya menemukan bahwa .rs.restartR () bekerja mirip dengan menekan ctrl + shift + F10. tetapi dosis tidak membongkar paket

Adam Lee Perelman
sumber
Berfungsi di RStudio - tetapi saya tidak yakin ada cara untuk membuatnya berfungsi di tempat lain. Dari getAnywhere(".rs.restartR")itu tampaknya masuk tools:rstudio. Saya belum beruntung mengaksesnya dalam sesi R murni.
Gregor Thomas
11
.rs.restartR()tidak membongkar paket, jadi tidak persis sama denganctrl+shift+f10
Arthur
7

Sebagai alternatif lain, Emacs ESS (> = 16.10) dapat memuat ulang proses R inferior inferior-ess-r-reload-hookyang terikat C-c C-e C-rsecara default.

ppanko.dll
sumber
Bekerja! brilian!
agen18
4

Posting lama, tetapi tidak ada jawaban yang berfungsi (bagi saya, saya menggunakan Windows, belum menguji yang lain), jadi saya akan menambahkan solusi saya. Beberapa terminologi saya mungkin salah di sini, tetapi ini harus menjelaskan maksudnya:

Jawaban di atas tidak cukup berhasil

Sebagian besar jawaban yang dikirimkan di sini melibatkan penggunaan shellatau systemyang tidak cukup berfungsi karena saat mereka membuka konsol R baru dan menginstruksikan konsol asli untuk ditutup, konsol baru adalah proses yang berjalan dalam konteks aplikasi konsol lama. Itu berarti konsol asli tidak dapat ditutup hingga konsol baru ditutup. Beberapa pengguna di atas seperti hedgedandlevered melaporkan bahwa menutup konsol asli akan memaksa konsol baru untuk ditutup. Saat saya coba, konsol baru tidak terbuka, tetapi konsol lama tetap terbuka dalam keadaan beku sampai konsol baru ditutup.

Masalah dasarnya adalah memanggil shellatau systemtidak mengubah konteks aplikasi dari konsol asli ke yang baru, dan oleh karena itu proses asli tidak dapat dihentikan hingga konsol baru ditutup.

Alternatif yang cocok untuk saya

Sebagai gantinya gunakan shell.execyang biasanya digunakan untuk membuka file di aplikasi default berdasarkan jenis file. Ketika digunakan pada .exe, ternyata, itu menjalankan executable. Perbedaan penting, bagaimanapun, adalah bahwa sistem memulai aplikasi dalam konteksnya sendiri yang terpisah. Jadi, inilah kode yang berfungsi untuk saya:

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

Anda harus mengedit jalur file /bin/x64/Rgui.exeagar cocok dengan apa pun yang Anda gunakan untuk memulai R. Anda cukup meletakkan baris ini di .Rprofilefile Anda , lalu Anda dapat memanggilnya dengan memasukkan restart.Rkode R.

Kelemahan dari ini dibandingkan metode lain adalah Anda tidak dapat melewatkan argumen baris perintah seperti yang --no-saveAnda lakukan dengan just shell, tetapi setidaknya ini akan membiarkan Anda menutup proses R asli.

Matthew
sumber
4

Setelah mencari solusi untuk ini, saya menyelesaikan masalah saya berdasarkan solusi ini di sini , menggunakan R Package RDCOMClient .
Solusi di bawah ini hanya berfungsi dalam RStudio (Windows), setelah mensimulasikan penekanan tombol ctrl + shift + F10 .

Paket RDCOMClient harus diinstal dengan perintah di bawah ini:

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

Kode untuk mensimulasikan penekanan tombol dalam RStudio (Windows 10) adalah:

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

Pada baris terakhir pada kode di atas, tombol 'ctrl' diwakili oleh '^' dan tombol shift dengan '+'. Semua penjelasan untuk representasi kunci ini tersedia di sini .

Setelah menjalankan baris terakhir kode di atas, seluruh sesi R di RStudio akan diatur ulang, menurut komentar @steadyfish . Artinya, ini menghapus semua data dari sesi saat ini dan membongkar semua paket yang dimuat di sesi tersebut.

Eduardo Alvim
sumber
2

Tuliskan fungsi ini di profil .R Anda

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

r()memulai kembali sesi R. Paket yang dimuat tidak akan dimuat ulang. Lingkungan Anda tidak akan disimpan.

Bekerja untuk Linux. Tidak tahu apa yang mungkin terjadi di OS lain

Andrea
sumber
1

Saya membutuhkan fungsionalitas sesi penyegaran yang sama di windows dan saya berakhir dengan versi kode yang sedikit dimodifikasi:

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

Di windows, Anda perlu mengubah Rprofile.sitefile. Itu ada di bawah etcdirektori R. Juga hati-hati untuk bagian terakhir dari jalur yang bin/x64dapat berubah sesuai dengan konfigurasi sistem Anda. Saya harap ini akan membantu orang lain juga.

mron
sumber
1

Sejalan dengan gagasan Martin Morgan tentang penggunaan .Last(); ini memulai ulang R dengan serangkaian opsi baris perintah yang sama seperti yang dipanggil sebelumnya:

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
sumber
2
FYI, saya telah menambahkan startup::restart()ke paket startup sebagai cara
konvensi untuk
1

Saya pikir, seseorang menyadari penggunaan terbaik R dengan mengatur direktori kerja saat ini dalam opsi. Kemudian setiap kali file ruang kerja / sesi Anda mulai menampilkan Anda atau memiliki cukup pekerjaan Anda di dalamnya (di antara proyek), Anda dapat mengganti nama file sesi default ini di direktori kerja setelah menutup R dan R / Rstudio secara otomatis akan memulai Anda dengan yang baru. file ruang kerja / sesi, tanpa mengganggu pekerjaan Anda saat ini.

Ingatlah untuk keluar dari R dan mengganti nama file sesi saat ini

Tentu saja jika Anda tidak ingin menyimpan pekerjaan saat ini, Anda harus memastikan Anda mereset objek atau operasi pada mereka dilakukan setelah menyalin dari objek asli sehingga apa adanya. Percayalah, mengetahui Anda selalu dapat memuat ruang kerja lama adalah godaan, tetapi lebih berguna daripada tidak.

Singkatnya keluar dari R, ini memberi Anda beberapa celah saat berhenti berarti ruang kerja ini penuh, ganti namanya setelah menyelesaikan keluar dan mulai ulang R / Rstudio dengan ruang kerja baru. Anda selalu dapat memuat objek terpilih di ruang kerja baru. Idealnya semua pekerjaan penting harus ada di direktori Proyek tetapi Anda masih memerlukan riwayat pekerjaan Anda untuk kembali ke waktu tertentu dan sesi yang disimpan berguna di beberapa titik setelah Anda mengerjakan proyek yang lebih lama. Jika Anda tidak membutuhkannya sajarm(list=ls())

Juga, saya suka RDComClientide dari @Eduardo Alvin tetapi sudah dihentikan.

OPSI ALTERNATIF

Alternatif sederhana untuk membuang bagasi kapan saja di dalam ruang kerja Anda adalah dengan menggunakan save.image

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

Ini membuat Anda bebas untuk datang dan pergi sesuka Anda dan membuka ruang kerja sebanyak yang Anda butuhkan.

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

atau dengan --save atau --no-save

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

Saya rasa inilah yang Anda perlukan jika Anda telah menggunakan setwd () sebelum memanggil segarkan (meskipun ini maupun versi aslinya tidak bekerja untuk saya, karena restart R kemudian menutup sendiri, jendela baru tidak pernah terbuka. Jika ada yang bisa mengomentari ini, tolong lakukan itu)

hedgedandlevered
sumber
ketika saya mencoba ini, jendela baru terbuka, tetapi jendela lama tetap terbuka dalam keadaan beku sampai jendela baru ditutup
Matius
0

Saya telah menulis fungsi berikut. Ingat! Anda hanya dapat menggunakannya sekali, lalu Anda harus memuatnya kembali setelah sesi R dimulai ulang.

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

Terkadang melepaskan paket juga membantu.

Adam Lee Perelman
sumber