我是否可以在 R 中创建一个别名,使其执行 q()
然后重新启动一个干净的 R 会话?
是的,我太懒了,不想输入 q()
然后再输入字母 R
:)
如果您使用的是RStudio: 按下命令/ctrl + shift + F10
您也可以使用
.rs.restartR()
.rs.restartR()
似乎没有执行这些操作。 - steadyfish根据你如何启动R,尝试将以下一行代码之一放入你的.Rprofile
文件中:
makeActiveBinding("refresh", function() { shell("Rgui"); q("no") }, .GlobalEnv)
makeActiveBinding("refresh", function() { system("R"); q("no") }, .GlobalEnv)
然后在 R 控制台中输入:
refresh
将关闭当前会话并启动新会话。
.Last <- function() system("R")
甚至在关闭周期晚些时候reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE)
,然后q()
会不断返回。 - Martin Morganq("no")
的目的是什么?如果我只在VS Code中运行system("R")
,会话似乎重新启动得很好(变量被删除并且包被分离,然后开始一个新会话)。 - M. Rodo我发现.rs.restartR()与按下ctrl+shift+F10类似,但不会卸载程序包。
getAnywhere(".rs.restartR")
中可以看出它在tools:rstudio
中。我在纯R会话中没有成功访问过它。 - Gregor Thomas.rs.restartR()
不能卸载已加载的软件包,因此它与ctrl+shift+f10
不是完全相同的。 - Arthur.rs.restartR()
会将环境中的对象和包重新加载到重新启动的会话中。 - Rasmus LarsenC-c C-e C-r
的inferior-ess-r-reload-hook
重新加载次级 R 进程。在寻找解决方案后,我根据这里的解决方案使用了R包RDCOMClient来解决我的问题。
以下解决方案仅适用于RStudio(Windows),因为它模拟了按下ctrl+ shift + F10键。
必须使用以下命令安装RDCOMClient软件包:
install.packages("RDCOMClient", repos = "http://www.omegahat.net/R")
library(RDCOMClient)
wsh <- COMCreate("Wscript.Shell")
wsh$SendKeys("^+{F10}")
虽然这是旧帖子,但是没有一个答案适合我(我使用的是Windows,没有测试其他操作系统),所以我会添加我的解决方案。这里可能有些术语不准确,但是应该可以理解:
以上答案不能完全解决问题
在这里提交的大部分答案都涉及使用shell
或system
,但是这并不能完全解决问题,因为虽然它们会打开一个新的R控制台并指示原始控制台关闭,但是新的控制台是在旧控制台的应用程序上下文中运行的进程。这意味着在新的控制台关闭之前,原始控制台无法关闭。像hedgedandlevered等用户报告说,关闭原始控制台会强制新的控制台关闭。当我尝试时,新的控制台确实会打开,但旧的控制台仍然以冻结状态保持打开状态,直到新的控制台关闭。
基本问题在于调用shell
或system
不会将应用程序上下文从原始控制台更改为新控制台,因此原始进程无法终止,直到新控制台关闭。
适用于我的替代方案
相反,使用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
文件中,然后您可以通过在R代码中输入restart.R
来调用它。shell
那样传递命令行参数,例如--no-save
,但至少这将让您关闭原始的R进程。请在您的.Rprofile文件中编写此函数。
r <- function() {
assign('.Last', function() {system('R')}, envir = globalenv())
quit(save = 'no')
}
r()
重启 R 会话。已加载的包不会重新加载。你的环境不会被保存。
仅适用于 Linux 系统。对其他操作系统的使用效果未知。
我需要在Windows上实现相同的刷新会话功能,最终得到了稍微修改过的代码:
makeActiveBinding("refresh", function() { shell(paste0("start \"\" \"", R.home(), "/bin/x64/Rgui.exe\"")); q("no") }, .GlobalEnv)
Rprofile.site
文件。它位于R的etc
目录下。还要注意路径的最后一部分,bin/x64
可能会根据您的系统配置而改变。我希望这能帮助其他人。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")
按照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)
}
rm(list=ls())
来清除你的工作空间,但这不是你的意思对吧? - Sacha Epskampq()
中添加一个新的选项save
参数,例如"r"
,它可以在不保存工作区的情况下重新启动 R。然后可以为q("r")
分配一个别名到一个新函数,该函数重新启动 R。 - Greg