2011-06-10 468 views
57

有沒有一種方法可以在R中執行別名,執行q()並重新啓動一個乾淨的R會話?從R內退出並重新啓動一個乾淨的R會話?

是的,我懶得打字q(),然後按字母R :)

+0

那麼你可以用'rm(list = ls())'清理你的工作空間,但那不是你的意思吧? – 2011-06-11 09:01:37

+2

你是否也想分離你可能附帶的任何軟件包和其他東西? – Spacedman 2011-06-11 09:15:58

+2

也許一個建議是將一個新選項'save'參數添加到'q()',如''r「',它可以在不保存工作空間的情況下重新啓動R。那麼'q(「r」)'的別名可以分配給一個新的函數,該函數可以重新啓動R. – Greg 2011-06-11 22:35:25

回答

46

取決於你如何啓動[R試着將這些行之一到您.Rprofile文件:

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

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

然後進入R控制檯:

refresh 

將關閉當前會話並啓動一個新的會話。

+4

或'.Last < - function()系統(「R」)'或者甚至在關閉週期'reg中。終結器(.GlobalEnv,函數(e)系統(「R」),TRUE)'。然後'q()'不斷回來。 – 2011-06-11 21:57:25

+0

這只是關閉R – hedgedandlevered 2014-04-11 13:23:04

+0

確保R在您的PATH上。 – 2014-04-11 15:32:08

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

或--save --no或保存

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

我覺得這是你需要什麼,如果你調用刷新之前使用setwd()(儘管這也不是原來沒有版本適用於我,因爲它重新啓動R然後關閉自己,一個新的窗口永遠不會打開。如果有人可以對此發表評論,請這樣做)

+0

當我嘗試這個時,打開一個新窗口,但舊窗口保持打開凍結狀態,直到新窗口關閉 – Matthew 2017-07-26 14:46:27

35

如果你在RStudio: 命令/ ctrl + shift + F10

您還可以使用

.rs.restartR() 
+6

我相信打開一個「乾淨的R會話「要求從當前會話中刪除1-Data;來自當前會話的2個包被卸載。 '.rs.restartR()'似乎沒有在我的機器上做這兩件事情之一。 – steadyfish 2016-05-06 13:58:19

+1

我發現.rs.restartR()對於即使在刪除後R也不會釋放內存的情況很有用(list = ls ()); GC();。這絕對可以釋放內存。我也喜歡它不分離包的事實。 – 2017-04-20 17:09:49

1

我需要在Windows相同的刷新會議的功能,我結束了代碼稍加修改的版本:

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

在Windows下你需要修改Rprofile.site文件。它位於R的etc目錄下。還要注意bin/x64可以根據您的系統配置更改路徑的最後部分。我希望這也能幫助其他人。

7

我發現.rs.restartR()的工作方式與按Ctrl + Shift + F10一樣。

+0

在RStudio中工作 - 但我不確定是否有辦法讓它在其他地方工作。從'getAnywhere(「。rs.restartR」)'它似乎在'tools:rstudio'中。在純R會話中,我沒有任何運氣可以訪問它。 – Gregor 2016-01-28 19:57:21

+3

'.rs.restartR()'不會卸載軟件包,所以它不是* ctrl + shift + f10 * – Arthur 2016-02-01 14:36:56

0

我寫了下面的函數。 記住!您只能使用一次,然後在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 
} 

有時拆開包裝也有幫助。

0

符合馬丁摩根的想法使用.Last();這將重新啓動R中的同一組的命令行選項,以前被稱爲:

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

舊的職位,但沒有一個答案相當的工作(對我來說,我使用的是Windows,還沒有測試等),所以我會添加我的解決方案。我的一些術語可能是在這裏下車,但這應該得到跨越點:

以上的答案不甚工作

這裏大部分提交的答案涉及使用shellsystem這完全不是那麼回事因爲在他們打開新的R控制檯並指示原始控制檯關閉的同時,新控制檯是在舊控制檯的應用程序上下文中運行的進程。這意味着直到新的控制檯關閉時,原始控制檯才能關閉。上述一些用戶(例如hedged和lever)報告說,關閉原始控制檯會強制關閉新控制檯。當我嘗試時,新的控制檯確實打開,但舊的控制檯保持打開狀態,直到新的控制檯關閉。

基本問題是調用shellsystem不會將應用程序上下文從原始控制檯更改爲新控制檯,因此原始進程無法終止,直到新控制檯關閉。

的替代方案,爲我的作品

而是使用shell.exec這通常會被用來打開基於文件類型的默認應用程序的文件。當在.exe上使用時,它顯然會運行可執行文件。但是,重要的區別在於系統在它自己的獨立上下文中啓動應用程序。因此,這裏是爲我的作品的代碼:

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

你需要什麼,你用它來啓動R.你只是把這個線你.Rprofile文件進行編輯的文件路徑/bin/x64/Rgui.exe匹配,那麼你可以把它叫做在您的R代碼中輸入restart.R

與其他方法相比,這種方法的缺點是不能像--no-save那樣傳遞命令行參數,只需要使用shell即可,但至少可以讓您關閉原始R進程。