在Rstudio内重启R

43

我想通过使用system2()在R中调用一个简单的Python脚本。我读到一些含糊的信息,说如果使用了“太多”的内存,它就不起作用。

如果我加载了一个大型数据集,并使用其中的一些信息作为参数传递给system2(),只有当我手动点击“重新启动R”时,它才能正常工作。

我的要求:

df <- read.csv('some_large_file.csv')
###extracting some info called 'args_vec'
for(arg in args_vec){
    system2('python', args)
}

这个代码不会起作用。for循环只是被跳过了。
我需要的是:
df <- read.csv('some_large_file.csv')
###extracting some info called 'args_vec'
###something that 'restarts' R
for(arg in args_vec){
    system2('python', args)
}

这个答案并没有完全满足我的需求。换句话说,它在Rstudio中不能正常工作,并调用了“system”(在这种情况下与“system2”存在相同的问题)。实际上,当我将上述引用的答案放入我的Rprofile.site文件中时,它会立即关闭rstudio:

我尝试了建议作为普通函数(而不是使用“makeActiveBinding”),但它并没有完全起作用。

##restart R in r session  -- doesn't work
makeActiveBinding("refresh", function() { system("R --save"); q("no") }, .GlobalEnv)

##nor did this:
refresh <- function() { system("R --save"); q("no") }

我尝试了上述这两个选项的多种变化,但这对于一个看起来简单的问题来说已经太长了。关于启动过程,我还有很多不理解的地方,“makeActiveBinding”也有点神秘。有人能指导我吗?


你确定你真的需要重新启动整个 R 吗?如果你使用 rm(list=ls()) 清理工作区,然后再用 gc() 进行手动垃圾回收,那应该就足够了吧? - Jouni Helske
@BenHunter,它立即关闭了RStudio,因为您在重新启动后调用了q。去掉对q的调用,它应该与在RStudio中选择“重新启动R”完全相同。 - Matthew Plourde
@Hemmo,我知道那是一个选项,在这种情况下可能是个不错的选择,但我真的很想知道如何解决这个问题,而不需要失去我的工作空间(或者保存、移除,然后重新加载它)。 - Ben Hunter
@Matthew Plourde,这个方法几乎可以,但是Rstudio只是重新加载而没有给我提示符。具体来说,所有的启动活动都会再次运行,我可以看到从我的Rprofile中加载的包,但是我看不到">"提示符。 - Ben Hunter
@BenHunter,有趣,我确实得到了提示。您是使用主动绑定还是功能方式?另外,使用主动绑定在这种情况下就像玩火一样,而且是不必要的——我不建议这样做。 - Matthew Plourde
显示剩余2条评论
5个回答

92

在Rstudio中,您可以通过以下方式重新启动R会话:

command/ctrl + shift + F10 

你还可以使用:

.rs.restartR()

2
这并不是答案,因为似乎他们想要一个命令行。 - Arthur

15

RStudio有这个未记录的rs.restartR(),它被认为是用于重新启动R。

然而,它不会卸载已加载的包,也不会清理环境,因此我对它是否真正重新启动了R存在一些怀疑。


5
它确实释放了以前被占用并稍后被释放的任何内存...因此它确实有作用(在某些情况下非常有用)。 - Patrick Coulombe
确实非常适合我的用例:我经常使用read.xlsx从共享驱动器中读取受密码保护的Excel文件,这会使Excel文件变为只读。然后我可以运行上述代码行,以防止只读的后果。因此,我的团队其他成员可以愉快地保存任何对我的工作不重要的编辑。 - its.me.adam

3
如果您使用RStudio,请使用菜单项“会话>重新启动R”或相关的键盘快捷键Ctrl+Shift+F10(Windows和Linux)或Command+Shift+F10(Mac OS)。其他键盘快捷键使重新启动开发变得更加容易,即“重新运行到此处的所有代码”:

在R脚本中,使用Ctrl+Alt+B(Windows和Linux)或Command+Option+B(Mac OS) 在R markdown中,使用Ctrl+Alt+P(Windows和Linux)或Command+Option+P(Mac OS) 如果您从shell运行R,请使用Ctrl+Dq()退出,然后重新启动R。


2
对于那些不想受限于命令,想要实际重置系统(无先前状态、无已加载的程序包、无变量等)的人,可以从“会话”菜单中选择Terminate R
这有点麻烦(会询问您是否确定)。如果有人知道类似于 MATLAB 中的 clear all 或者真正的 clear classes 的东西,请告诉我!

0
你尝试过将函数调用嵌入到apply函数中,而不是for循环中吗?
我曾经有一些代码片段,在for循环中会耗尽系统内存,但使用apply函数却可以完美运行。这可能会有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接