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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With