有什么方法可以在R中创建一个别名,该别名将执行q()
然后重新启动一个干净的R会话?
是的,我太懒了,无法输入q()
字母R
:)
有什么方法可以在R中创建一个别名,该别名将执行q()
然后重新启动一个干净的R会话?
是的,我太懒了,无法输入q()
字母R
:)
save
参数q()
,例如"r"
,以在不保存工作空间的情况下重新启动R。那么对于一个别名q("r")
可能会被分配到一个新的功能重新启动R.
Answers:
根据您启动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()
继续回来。
我发现.rs.restartR()的工作方式与按ctrl + shift + F10相似。但不要卸载包装
getAnywhere(".rs.restartR")
它似乎在tools:rstudio
。在纯R会话中我没有运气。
.rs.restartR()
不会卸载包裹,因此与ctrl+shift+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
文件中,然后可以通过输入restart.R
R代码来调用它。
与其他方法相比,这样做的不利之处在于,您不能像--no-save
just那样传递命令行参数shell
,但是至少这会让您关闭原始的R进程。
寻找一个解决方案,在此之后,我解决了在此基础上解决我的问题在这里,使用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会话将被重置。也就是说,它将从当前会话中删除所有数据,并卸载会话中所有已加载的程序包。
符合马丁·摩根(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)
}
我认为,可以通过在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")
这使您可以随意随意出入,并可以根据需要打开任意数量的工作区。
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然后关闭自身,所以永远不会打开新窗口。如果有人可以评论这个,请这样做)
rm(list=ls())
但这不是您的意思吧?