在R中运行异步函数

10

我有以下的代码:

myfun <- function() {
  fun2()

  return(1+1)
}

我希望fun2()被调用后立即进入下一行,而不必等待结果。函数fun2没有返回任何内容,我不在意它何时完成,我只需要启动它。最佳方法是什么?并行处理、多线程、异步调用?如果有代码示例将不胜感激。


1
可能是R - Run source() in background的重复问题。 - HubertL
你使用的操作系统是什么?Windows? - Steve Weston
是的,Windows 7。虽然我也希望它能在其他操作系统上运行。 - Sergey Ivanov
2个回答

24

future包(我是作者)提供以下功能:

library("future")
plan(multisession)

myfun <- function() {
  future(fun2())

  return(1+1)
}

除非fun2()是用于纯副作用的函数,否则通常需要检索该future表达式的值,方法如下:

f <- future(fun2())
y <- fun3()
v <- value(f)
z <- v + y

另一种选择是使用 %<-% 运算符,例如:

v %<-% fun2()
y <- fun3()
z <- v + y

顺便提一下,如果您使用

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

那么,未来表达式将在这些机器上的一台上解析。使用

plan(future.batchtools::batchtools_slurm)

将导致任务通过Slurm作业调度程序队列解决。


您会建议在使用未来引擎时使用foreach接口,还是furrr呢? - jiggunjer
1
它们都是MapReduce的兄弟姐妹,在并行处理方面同样高效:foreach w/ doFuture, future.apply, furrr, ... 您可以选择自己喜欢的MapReduce风格。 - HenrikB
1
谢谢。我看了你的RStudio演示,感谢你帮助我们更快地运行模型! - jiggunjer
谢谢,我很高兴你觉得它有用。{未来}是在其他人先前和现有的工作基础上建立的,因此我也站在巨人的肩膀上。 - HenrikB

5

最终我采用了以下解决方案:

Rpath <- Find(file.exists, c(commandArgs()[[1]], file.path(R.home("bin"), commandArgs()[[1]]),
                             file.path(R.home("bin"), "R"), file.path(R.home("bin"), "Rscript.exe")))
out <- system('%s --no-save --slave -e \"Your R code here\" ', wait=FALSE)

第一行代码搜索R可执行文件的路径,第二行在命令行环境下执行R代码而不等待结果。

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