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

时间:2011-06-10 23:42:30

标签: r alias

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

是的,我懒得输入q()然后输入R字母:)

12 个答案:

答案 0 :(得分:60)

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

您也可以使用

.rs.restartR()

答案 1 :(得分:51)

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

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

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

然后将其输入R控制台:

refresh

将关闭当前会话并启动新会话。

答案 2 :(得分:7)

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

答案 3 :(得分:4)

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

以上答案不太有用

这里提交的大多数答案都涉及使用shellsystem,但这并不是很有效,因为当他们打开一个新的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文件中,然后输入{{1在你的R代码中。

这比其他方法的缺点是你不能像restart.R那样传递像--no-save这样的命令行参数,但至少这会让你关闭原来的R进程

答案 4 :(得分:4)

在寻找解决方案之后,我使用R包 RDCOMClient 解决了基于此解决方案here的问题。
一旦模拟了按键ctrl + shift + F10 ,解决方案就会在RStudio(Windows)中运行。

必须使用命令bellow:

安装RDCOMClient软件包
install.packages("RDCOMClient", repos = "http://www.omegahat.net/R")

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

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

在上面代码的最后一行中,'ctrl'键由'^'表示,shift键由'+'表示。此关键表示的所有解释均可用here

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

答案 5 :(得分:2)

将此功能写入您的.Rprofile

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

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

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

答案 6 :(得分: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 :(得分:1)

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

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

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

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

此外,我喜欢@Eduardo Alvin的RDComClient想法,但该想法已经停产。

替代选项

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

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

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

答案 8 :(得分:1)

作为另一种选择,Emacs ESS(> = 16.10)可以通过默认情况下绑定到jmeter -g C:/Users/E01659/Desktop/feb28/feb28_10_3600.csv -o C:/Users/E01659/Downloads/apache-jmeter-5.1/bin/sonali/的{​​{1}}重新加载下级R进程。

答案 9 :(得分: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然后自行关闭,一个新窗口永远不会打开。如果有人可以对此发表评论,请这样做)

答案 10 :(得分: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
}

有时候拆包也会有所帮助。

答案 11 :(得分:0)

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