Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run asynchronous function in R

I have the following code:

myfun <- function() {
  fun2()

  return(1+1)
}

I want fun2() is invoked and then moved to the next lines without waiting for the result. Function fun2 does not return anything and I don't care when it finishes, I just need to launch it. What is the best way to achieve it? Parallel process, multithreading, async call? Any code samples are appreciated.

like image 805
Sergey Ivanov Avatar asked Dec 09 '16 10:12

Sergey Ivanov


2 Answers

The future package (I'm the author) provides this:

library("future")
plan(multiprocess)

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

  return(1+1)
}

Unless fun2() is function used purely for its side effects, you typically want to retrieve the value of that future expression, which you do as:

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

An alternative is to use the %<-% operator as in:

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

FYI, if you use

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

then the future expression is resolved on one of those machines. Using

plan(future.BatchJobs::batchjobs_slurm)

will cause it to be resolved via a Slurm job scheduler queue.

like image 183
HenrikB Avatar answered Oct 14 '22 06:10

HenrikB


Eventually I stopped on the following solution:

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)

The first line searches for the path of R executable, and the second executes R code from the command-line environment not waiting for result.

like image 32
Sergey Ivanov Avatar answered Oct 14 '22 04:10

Sergey Ivanov