从R内退出并重新启动一个干净的R会话?

有没有一种方法,我可以在R中做一个别名,将执行q()和重新启动一个干净的R会话?

是的,我懒得键入q()然后字母R 🙂

根据您如何开始R,请尝试将以下其中一行放入.Rprofile文件中:

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

然后进入R控制台:

 refresh 

将closures当前会话并启动一个新的会话。

如果你在RStudio中:command / ctrl + shift + F10

你也可以使用

 .rs.restartR() 

我发现.rs.restartR()的工作原理与按Ctrl + Shift + F10一样。

我需要在Windows上的相同的刷新会话function,我最后修改了一些代码:

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

在Windows上,您需要修改Rprofile.site文件。 它在R的etc目录下。 还要注意bin/x64可以根据您的系统configuration更改path的最后部分。 我希望这也能帮助别人。

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

或者用 – 保存或者 – 保存

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

如果你在调用刷新之前使用了setwd(),那么我认为这是你需要的(虽然这个和原始版本都不适用于我,因为它重新启动R然后自动closures,一个新的窗口永远不会打开。这个,请这样做)

我写了下面的函数。 记得! 您只能使用一次,然后在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 } 

有时分离一个包也有帮助。

符合马丁·摩根的使用.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) } 

旧的post,但没有一个答案很有效(对我来说,我使用Windows,没有testing其他人),所以我会添加我的解决scheme。 我的一些术语可能会在这里,但是这应该得到重点:

上面的答案不太有效

这里提交的大多数答案都涉及到使用shell或者system ,因为当它们打开一个新的R控制台并且指示原来的控制台closures时,新控制台是一个运行在旧控制台应用程序上下文中的进程。 这意味着直到新的控制台closures,原来的控制台才能closures。 上述一些用户(例如hedged andlevered)报告说,closures原始控制台会强制closures新的控制台。 当我尝试,新的控制台打开,但旧的控制台保持打开冻结状态,直到新的控制台closures。

基本问题是调用shellsystem不会将应用程序上下文从原始控制台更改为新的控制台,因此原始进程无法终止,直到新的控制台closures。

替代scheme适合我

而是使用通常用于在基于文件types的默认应用程序中打开文件的shell.exec 。 在.exe上使用时,显然,它运行可执行文件。 但是,重要的区别在于,系统在自己的独立上下文中启动应用程序。 所以这里是适合我的代码:

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

您需要编辑文件path/bin/x64/Rgui.exe以匹配您用来启动R的任何文件。您只需将该行放在.Rprofile文件中,然后在R中input.Rprofile即可调用该文件码。

与其他方法相比,这个方法的缺点是你不能像shell那样传递像--no-save这样的命令行参数,但至less可以让你closures原来的R进程。