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

jus*_*tin 79 alias r

有没有办法可以在R中创建一个别名来执行q()并重新启动一个干净的R会话?

是的,我太懒了键入q()然后信R:)

mgo*_*ser 68

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

你也可以使用

.rs.restartR()
Run Code Online (Sandbox Code Playgroud)

  • 我相信打开一个"干净的R会话"需要删除当前会话的1-Data; 卸载当前会话的2个包.`.rs.restartR()`在我的机器上似乎没有做这些事情. (9认同)
  • 我发现.rs.restartR()对于即使在remove(list = ls())之后R也不会释放内存的情况很有用; GC();.这绝对可以释放内存.我也喜欢它不拆包的事实. (3认同)

G. *_*eck 55

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

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

makeActiveBinding("refresh", function() { system("R"); q("no") }, .GlobalEnv)
Run Code Online (Sandbox Code Playgroud)

然后将其输入R控制台:

refresh
Run Code Online (Sandbox Code Playgroud)

将关闭当前会话并启动一个新会话.

  • 或`.Last < - function()系统("R")`或甚至更晚的关闭周期`reg.finalizer(.GlobalEnv,function(e)system("R"),TRUE)`.然后`q()`不断回来. (4认同)
  • 此解决方案有效但在我的脚本由其他人运行时无法重现.是否有一个命令要包含在R脚本中以重新启动R会话?(原因是我希望所有包都分离) (2认同)

小智 11

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


Ada*_*man 9

我发现.rs.restartR()就像按下ctrl + shift + F10一样.

  • `.rs.restartR()`不卸载软件包,所以它与*ctrl + shift + f10不完全相同* (9认同)

小智 6

在寻找解决方案后,我使用 R 包RDCOMClient基于解决方案解决了我的问题。一旦模拟按键 ctrl+shift+F10 ,下面的解决方案就可以在 RStudio (Windows) 中工作

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

install.packages("RDCOMClient", repos = "http://www.omegahat.net/R")
Run Code Online (Sandbox Code Playgroud)

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

library(RDCOMClient) 
wsh <- COMCreate("Wscript.Shell") 
wsh$SendKeys("^+{F10}") 
Run Code Online (Sandbox Code Playgroud)

在上面代码的最后一行中,“ctrl”键由“^”表示,Shift 键由“+”表示。有关此关键表示的所有解释均可在此处找到。

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


Mat*_*hew 5

旧帖子,但没有一个答案很有效(对我来说,我使用的是 Windows,还没有测试其他人),所以我会添加我的解决方案。我的一些术语可能不在这里,但这应该能说明问题:

以上答案不太有效

此处提交的大多数答案都涉及使用shellsystem不太有效,因为当它们打开新的 R 控制台并指示原始控制台关闭时,新控制台是在旧控制台的应用程序上下文中运行的进程。这意味着在新控制台关闭之前,原始控制台无法关闭。上面的一些用户如hedgedandlevered 报告说,关闭原始控制台会强制关闭新控制台。当我尝试时,新控制台确实打开了,但旧控制台保持打开并处于冻结状态,直到新控制台关闭。

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

对我有用的替代方案

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

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

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

与其他方法相比,这种方法的缺点是您不能像使用--no-save那样传递命令行参数shell,但至少这可以让您关闭原始 R 进程。


hed*_*red 0

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

或使用 --save 或 --no-save

paste0(R.home(),"/bin/i386/R --no-save")
Run Code Online (Sandbox Code Playgroud)

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