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


88

有什么方法可以在R中创建一个别名,该别名将执行q()然后重新启动一个干净的R会话?

是的,我太懒了,无法输入q()字母R:)


好吧,您可以使用清除工作空间,rm(list=ls())但这不是您的意思吧?
2011年

2
您是否还想分离任何包装和可能附带的其他物品?
Spacedman 2011年

2
可能的建议是在上添加一个新的optionsave参数q(),例如"r",以在不保存工作空间的情况下重新启动R。那么对于一个别名q("r")可能会被分配到一个新的功能重新启动R.
格雷格-

Answers:


78

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

您也可以使用

.rs.restartR()

12
我相信打开一个“干净的R会话”要求删除当前会话中的1-Data。当前会话的2个软件包已卸载。.rs.restartR()似乎在我的机器上没有执行任何这些操作
。–稳定鱼

3
我发现.rs.restartR()对于即使在remove(list = ls())之后R也无法释放内存的情况下很有用;GC();。这绝对可以释放内存。我也喜欢它不会分离包的事实。
理查德·迪萨尔沃

56

根据您启动R的方式,尝试将以下行之一放入.Rprofile文件中:

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

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

然后将其输入R控制台:

refresh

将关闭当前会话并开始一个新的会话。


4
.Last <- function() system("R")什至在关机周期的后期reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE)。然后q()继续回来。
马丁·摩根

1
确保R在您的PATH上。
G. Grothendieck 2014年

2
当我的脚本由其他人运行时,此解决方案有效,但不可复制。R脚本中是否包含要重新启动R会话的命令?(原因是我希望将所有包裹都拆下来)
Heisenberg 2014年

13

我发现.rs.restartR()的工作方式与按ctrl + shift + F10相似。但不要卸载包装


可在RStudio中使用-但我不确定是否有办法使其在其他任何地方都可以使用。从getAnywhere(".rs.restartR")它似乎在tools:rstudio。在纯R会话中我没有运气。
Gregor Thomas

11
.rs.restartR()不会卸载包裹,因此与ctrl+shift+f10
Arthur

5

作为另一种选择,Emacs ESS(> = 16.10)可以重新加载劣质R进程,默认情况下inferior-ess-r-reload-hook绑定该进程C-c C-e C-r


作品!辉煌!
agent18

4

旧帖子,但是没有一个答案很有效(对我来说,我正在使用Windows,尚未测试其他操作系统),所以我将添加解决方案。我的某些术语可能在这里不适用,但这应该可以使您理解:

上面的答案不太有效

此处提交的大多数答案涉及使用shell或效果system不佳,因为当它们打开新的R控制台并指示关闭原始控制台时,新控制台是在旧控制台的应用程序上下文中运行的进程。这意味着原始控制台无法关闭,直到新控制台关闭。上面的某些用户(例如hedgedandlevered)报告说,关闭原始控制台会强制关闭新控制台。当我尝试时,新控制台确实会打开,但旧控制台仍处于冻结状态,直到关闭新控制台为止。

基本问题是调用应用程序上下文shellsystem将应用程序上下文从原始控制台更改为新控制台,因此,原始过程在新控制台关闭之前无法终止。

对我有用的替代方法

而是使用shell.exec通常用于基于文件类型在默认应用程序中打开文件的方式。当在.exe上使用时,显然,它运行可执行文件。但是,重要的区别在于,系统在其自己的单独上下文中启动应用程序。所以这是对我有用的代码:

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

您需要编辑文件路径/bin/x64/Rgui.exe以匹配用于启动R的任何内容。您只需将这一行放入.Rprofile文件中,然后可以通过输入restart.RR代码来调用它。

与其他方法相比,这样做的不利之处在于,您不能像--no-savejust那样传递命令行参数shell,但是至少这会让您关闭原始的R进程。


4

寻找一个解决方案,在此之后,我解决了在此基础上解决我的问题在这里,使用R包RDCOMClient
一旦模拟了按键ctrl + shift + F10,该解决方案就可以在RStudio(Windows)中使用

RDCOMClient软件包必须使用以下命令安装:

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

在RStudio(Windows 10)中模拟按键的代码为:

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

在上面代码的最后一行中,“ ctrl”键由“ ^”表示,而Shift键由“ +”表示。有关此关键代表的所有说明,请点击此处

根据@steadyfish的评论,在运行上述代码的最后一行之后,RStudio中的整个R会话将被重置。也就是说,它将从当前会话中删除所有数据,并卸载会话中所有已加载的程序包。


2

在您的.Rprofile中编写此函数

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

r()重新启动您的R会话。加载的软件包将不会重新加载。您的环境将无法保存。

适用于Linux。不知道其他操作系统可能会发生什么


1

我需要在Windows上具有相同的刷新会话功能,最后得到的代码略有修改:

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

在Windows上,您需要修改Rprofile.site文件。它在R的etc目录下。还请注意路径的最后一部分,该部分bin/x64可能会根据您的系统配置而改变。我希望这也会对其他人有所帮助。


1

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

2
仅供参考,我已作为重新启动R的startup::restart()
常规

1

我认为,可以通过在options中设置当前工作目录来实现R的最佳使用。然后,只要您的工作区/会话文件开始显示您的内容或其中有足够的工作(在项目之间),您就可以在关闭R后在工作目录中重命名该默认会话文件,并且R / Rstudio会自动从一个新的位置开始工作区/会话文件,而不会打扰您当前的工作。

记住退出R并重命名当前会话文件

当然,如果您不想保存当前的工作,则必须确保重设对象或对它们的操作是在从原始对象复制完之后进行的,因此它们保持原样。相信我,知道您总是可以加载旧的工作区是一种诱惑,但是比没有有用。

简而言之,退出R会给您一些间隙,而退出意味着此工作空间已满,请在完成退出后重命名它,然后使用新的工作空间重新启动R / Rstudio。您始终可以将选择的对象加载到新的工作空间中。理想情况下,所有重要的工作都应该在Project目录中,但是您仍然需要时常返回工作历史,并且当您在较长的项目中时,保存的会话有时会很有用。如果您不需要任何东西rm(list=ls())

另外,我喜欢RDComClient@Eduardo Alvin的想法,但该想法已被终止。

备选方案

在工作空间内随时摆脱行李的一种简单替代方法是使用 save.image

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

这使您可以随意随意出入,并可以根据需要打开任意数量的工作区


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

或--save或--no-save

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

我认为这是您在调用refresh之前使用setwd()所需要的(尽管此版本或原始版本都不适用于我,因为它会重新启动R然后关闭自身,所以永远不会打开新窗口。如果有人可以评论这个,请这样做)


当我尝试此操作时,会打开一个新窗口,但旧窗口会保持冻结状态打开,直到关闭新窗口为止
Matthew

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
}

有时分离包装也有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.