RStudio - 能否在后台运行代码?

29

关于RStudio的问题。假设我在控制台中运行代码:

> code1()

假设code1()不会在控制台上输出任何内容,但是code1()需要一个小时才能完成。我想在等待code1()的同时处理其他事情。这种情况下是否有可能?是否存在像runInBackground这样的函数可供使用?

> runInBackground(code1())
> code2()

可以运行两个RStudio,或编写批处理文件来使用Rscript运行code1(),但我想知道是否有更简单的方法可以在不离开RStudio控制台的情况下完成。我尝试浏览了R的帮助文档,但没有找到任何内容(或者可能我没有使用正确的关键字)。


5
这是不可能的。R 是单线程的。请运行两个独立的 R 进程。 - Thomas
3
请不要混淆RStudio和R。 RStudio仅是一个集成开发环境。 RStudio启动的是R本身的实例,实际上是运行您的代码的东西。 - joran
这意味着运行批处理文件应该成功。 - IRTFM
5
@Thomas,R是单线程并不意味着无法实现。这只是意味着假设的runinBackground函数将分叉一个新的独立的R线程,同时使“主”线程不受阻碍地继续调试。 - Dean MacGregor
4个回答

27

future包(我是作者)提供了以下内容:

library("future")
plan(multisession)

future(code1())
code2()

请注意,如果您使用

plan(cluster, workers = c("n1", "n3", "remote.server.org"))

那么未来表达式将在其中一台机器上得到解析。使用

plan(future.BatchJobs::batchjobs_slurm)

将导致它通过 Slurm 作业调度队列进行解决。

这个问题与在 R 中运行异步函数密切相关。


这只能在Linux上运行吗?还是我们可以在Windows上运行? - user5249203
1
任何操作系统 - HenrikB
我正在使用future运行API调用。但是,我没有得到状态码。有没有办法在future运行后获取状态码? - user5249203

12

你总是可以这样做,虽然不太理想但对于大多数情况来说都可以运作:

shell(cmd = 'Rscript.exe some_script.R', wait=FALSE)

11

自1.2版本起,RStudio提供了此功能。要在后台运行脚本,请在"Jobs"面板中选择"Start Job"。您还可以选择将后台作业的结果复制到工作环境中。


8

如果你使用的是Linux系统,那么在parallel软件包中的mcparallel()函数就能解决问题...

library(parallel)
Job1 = mcparallel(code1())
JobResult1 = mccollect(Job1)

这很棒 - 有没有办法从第二个任务打印到控制台,以便在完成时通知用户? - Ben Jones
1
@BenJones 您可以简单地将您的代码包装到一个打印屏幕的函数中:wrapper <- function(){ code1(); print("done") }; Job1 <- mcparallel(wrapper()); JobResult1 = mccollect(Job1) - ssanch

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