Thoát và bắt đầu lại một phiên R sạch từ bên trong R?


88

Có cách nào tôi có thể tạo một bí danh, trong R, sẽ thực thi q()và sau đó khởi động lại một phiên R sạch không?

Và vâng, tôi quá lười để gõ q()và sau đó là chữ cái R:)


Bạn có thể xóa không gian làm việc của mình rm(list=ls())nhưng đó không phải là ý bạn phải không?
Sacha Epskamp

2
Bạn có muốn tách bất kỳ gói nào và những thứ khác mà bạn có thể đã đính kèm không?
Spacedman

2
Có lẽ một gợi ý sẽ là thêm một savetham số tùy chọn mới q(), chẳng hạn như "r", khởi động lại R mà không lưu không gian làm việc. Sau đó, một bí danh cho q("r")có thể được gán cho một chức năng mới khởi động lại R.
Greg

Câu trả lời:


78

Nếu bạn đang sử dụng RStudio: lệnh / ctrl + shift + F10

Bạn cũng có thể dùng

.rs.restartR()

12
Tôi tin rằng việc mở "phiên R sạch" yêu cầu 1-Dữ liệu từ phiên hiện tại bị xóa; 2-Các gói từ phiên hiện tại được dỡ bỏ. .rs.restartR()dường như không làm được một trong những điều này trên máy của tôi ..
stablefish

3
Tôi thấy .rs.restartR () hữu ích cho các trường hợp R không giải phóng bộ nhớ ngay cả sau khi loại bỏ (list = ls ()); gc () ;. Điều này chắc chắn giải phóng bộ nhớ. Tôi cũng thích thực tế là nó không tách rời các gói.
Richard DiSalvo

56

Tùy thuộc vào cách bạn bắt đầu R, hãy thử đặt một trong những dòng sau vào .Rprofiletệp của bạn :

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

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

Sau đó nhập cái này vào bảng điều khiển R:

refresh

sẽ đóng phiên hiện tại và bắt đầu một phiên mới.


4
hoặc .Last <- function() system("R")thậm chí muộn hơn trong chu kỳ tắt máy reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE). Sau đó q()tiếp tục quay trở lại.
Martin Morgan

1
Đảm bảo R nằm trên PATH của bạn.
G. Grothendieck

2
Giải pháp này hoạt động nhưng không thể tái tạo khi tập lệnh của tôi do người khác chạy. Có lệnh nào được đưa vào tập lệnh R để khởi động lại phiên R không? (lý do là tôi muốn tất cả các gói được tách ra)
Heisenberg

13

Tôi thấy rằng .rs.restartR () hoạt động tương tự như nhấn ctrl + shift + F10. nhưng liều không dỡ các gói


Hoạt động trong RStudio - nhưng tôi không chắc có cách làm cho nó hoạt động ở bất kỳ nơi nào khác. Từ getAnywhere(".rs.restartR")nó dường như là trong tools:rstudio. Tôi đã không gặp may mắn khi truy cập nó trong một phiên R thuần túy.
Gregor Thomas

11
.rs.restartR()không dỡ các gói, vì vậy nó không hoàn toàn giống nhưctrl+shift+f10
Arthur

5

Là một giải pháp thay thế khác, Emacs ESS (> = 16.10) có thể tải lại quá trình R kém hơn qua inferior-ess-r-reload-hookđó được ràng buộc C-c C-e C-rtheo mặc định.


Làm! rực rỡ!
agent18

4

Bài cũ, nhưng không có câu trả lời nào khá hiệu quả (đối với tôi, tôi đang sử dụng Windows, chưa thử nghiệm những người khác), vì vậy tôi sẽ thêm giải pháp của mình. Một số thuật ngữ của tôi có thể bị tắt ở đây, nhưng điều này sẽ giải quyết vấn đề:

Các câu trả lời trên không hoạt động

Hầu hết các câu trả lời được gửi ở đây liên quan đến việc sử dụng shellhoặc cách systemnào không hoạt động vì trong khi họ mở bảng điều khiển R mới và thực hiện lệnh đóng bảng điều khiển ban đầu, bảng điều khiển mới là một quá trình chạy trong ngữ cảnh ứng dụng của bảng điều khiển cũ. Điều đó có nghĩa là bảng điều khiển ban đầu không thể đóng cho đến khi bảng điều khiển mới đóng lại. Một số người dùng ở trên, chẳng hạn như hedgedandlevered đã báo cáo rằng việc đóng bảng điều khiển gốc buộc bảng điều khiển mới phải đóng. Khi tôi thử, bảng điều khiển mới không mở, nhưng bảng điều khiển cũ vẫn mở ở trạng thái đóng băng cho đến khi bảng điều khiển mới đóng.

Vấn đề cơ bản là gọi shellhoặc systemkhông thay đổi ngữ cảnh ứng dụng từ bảng điều khiển gốc sang bảng điều khiển mới và do đó quá trình ban đầu không thể kết thúc cho đến khi bảng điều khiển mới đóng lại.

Giải pháp thay thế phù hợp với tôi

Thay vào đó, hãy sử dụng cách shell.execthường được sử dụng để mở tệp trong ứng dụng mặc định dựa trên loại tệp. Rõ ràng, khi được sử dụng trên .exe, nó chạy tệp thực thi. Tuy nhiên, sự khác biệt quan trọng là hệ thống khởi động ứng dụng trong ngữ cảnh riêng của nó. Vì vậy, đây là mã phù hợp với tôi:

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

Bạn sẽ cần chỉnh sửa đường dẫn tệp /bin/x64/Rgui.exeđể phù hợp với bất cứ thứ gì bạn sử dụng để bắt đầu R. Bạn chỉ cần đặt dòng này vào .Rprofiletệp của mình , sau đó bạn có thể gọi nó bằng cách nhập restart.Rmã R của mình.

Nhược điểm của phương pháp này so với các phương pháp khác là bạn không thể truyền các đối số dòng lệnh --no-savenhư bạn làm với chỉ shell, nhưng ít nhất điều này sẽ cho phép bạn đóng quá trình R ban đầu.


4

Sau khi tìm giải pháp cho vấn đề này, tôi đã giải quyết vấn đề của mình dựa trên giải pháp này tại đây , sử dụng R Package RDCOMClient .
Giải pháp dưới đây chỉ hoạt động trong RStudio (Windows), sau khi nó mô phỏng các lần nhấn phím ctrl + shift + F10 .

Gói RDCOMClient phải được cài đặt bằng lệnh dưới đây:

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

Mã để mô phỏng các lần nhấn phím trong RStudio (Windows 10) là:

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

Ở dòng cuối cùng trong đoạn mã trên, phím 'ctrl' được biểu thị bằng '^' và phím shift bằng '+'. Tất cả các giải thích cho các đại diện chính này có sẵn ở đây .

Ngay sau khi chạy dòng cuối cùng của đoạn mã trên, toàn bộ phiên R trong RStudio sẽ được đặt lại, theo nhận xét của @steadyfish . Nghĩa là, nó xóa tất cả dữ liệu khỏi phiên hiện tại và dỡ bỏ tất cả các gói đã tải trong phiên.


2

Viết hàm này trong tệp .Rprofile của bạn

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

r()khởi động lại phiên R của bạn. Các gói đã tải sẽ không tải lại. Môi trường của bạn sẽ không được lưu.

Hoạt động cho Linux. Không biết điều gì có thể xảy ra trên hệ điều hành khác


1

Tôi cần chức năng phiên làm mới tương tự trên windows và tôi đã kết thúc với một phiên bản mã được sửa đổi một chút:

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

Trên windows, bạn cần sửa đổi Rprofile.sitetệp. Nó nằm trong etcthư mục của R. Ngoài ra, hãy chú ý đến phần cuối cùng của đường dẫn bin/x64có thể thay đổi theo cấu hình hệ thống của bạn. Tôi hy vọng điều này cũng sẽ giúp những người khác.


1

Phù hợp với ý tưởng sử dụng của Martin Morgan .Last(); điều này khởi động lại R với cùng một tập hợp các tùy chọn dòng lệnh như được gọi trước đó:

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

2
FYI, tôi đã thêm startup::restart()vào khởi động gói như là một cách convenint của R. restart
HenrikB

1

Tôi nghĩ, người ta nhận ra cách sử dụng R tốt nhất bằng cách thiết lập một thư mục làm việc hiện tại trong các tùy chọn. Sau đó, bất cứ khi nào tệp phiên / không gian làm việc của bạn bắt đầu hiển thị cho bạn hoặc có đủ công việc của bạn trong đó (giữa các dự án), bạn chỉ có thể đổi tên tệp phiên mặc định này trong thư mục làm việc sau khi đóng R và R / Rstudio sẽ tự động bắt đầu bạn trong một không gian làm việc / tệp phiên, mà không làm phiền công việc hiện tại của bạn.

Hãy nhớ thoát R và đổi tên tệp phiên hiện tại

Tất nhiên nếu bạn không muốn lưu công việc hiện tại, bạn phải đảm bảo rằng bạn đặt lại các đối tượng hoặc các hoạt động trên chúng đã được thực hiện sau khi sao chép từ các đối tượng gốc để chúng như vậy. Tin tưởng tôi, biết rằng bạn luôn có thể tải các không gian làm việc cũ là một sự cám dỗ nhưng hữu ích hơn không.

Tóm lại, thoát R, nó cung cấp cho bạn một khoảng trống trong khi thoát có nghĩa là không gian làm việc này đã đầy, hãy đổi tên nó sau khi hoàn thành thoát và khởi động lại R / Rstudio với một không gian làm việc mới. Bạn luôn có thể tải các đối tượng được chọn trong không gian làm việc mới. Lý tưởng nhất là tất cả công việc quan trọng nên nằm trong thư mục Dự án nhưng bạn vẫn cần lịch sử công việc của mình để quay lại đôi khi và các phiên đã lưu sẽ hữu ích vào một thời điểm nào đó khi bạn thực hiện các dự án dài hơn. Nếu bạn không cần nó, chỉ cầnrm(list=ls())

Ngoài ra, tôi thích RDComClientý tưởng của @Eduardo Alvin nhưng nó đã bị ngừng.

LỰA CHỌN THAY THẾ

Một giải pháp thay thế đơn giản để loại bỏ hành lý bất cứ lúc nào bên trong không gian làm việc của bạn là sử dụng save.image

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

Điều này cho phép bạn tự do đến và đi tùy ý và mở nhiều không gian làm việc tùy ý .


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

hoặc với --save hoặc --no-save

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

Tôi nghĩ đây là những gì bạn cần nếu bạn đã sử dụng setwd () trước khi gọi refresh (mặc dù phiên bản này và phiên bản gốc đều không hoạt động với tôi, vì nó khởi động lại R rồi tự đóng, một cửa sổ mới sẽ không bao giờ được mở. Nếu ai đó có thể nhận xét về cái này, hãy làm như vậy)


khi tôi cố gắng này, một cửa sổ mới được mở ra, nhưng cửa sổ cũ được giữ mở trong tình trạng đông lạnh cho đến khi cửa sổ mới bị đóng
Matthew

0

Tôi đã viết hàm sau đây. Nhớ lại! Bạn chỉ có thể sử dụng nó một lần, sau đó bạn phải tải lại sau khi phiên R khởi động lại.

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

Đôi khi tách một gói ra cũng có ích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.