---
title: "5. Mirai Clusters - Base R"
vignette: >
  %\VignetteIndexEntry{5. Mirai Clusters - Base R}
  %\VignetteEngine{litedown::vignette}
  %\VignetteEncoding{UTF-8}
---



### Table of Contents

1. [Alternative Communications Backend for R](#alternative-communications-backend-for-r)
2. [Foreach Support](#foreach-support)

### Alternative Communications Backend for R

mirai provides an alternative communications backend for R.
This functionality was developed to fulfil a request by R Core at R Project Sprint 2023.

A 'miraiCluster' is recognised as one of the official cluster types, and may be created by `parallel::makeCluster(type = "MIRAI")` from R 4.5 onwards.
This function calls `make_cluster()`, which may also be used to directly create a 'miraiCluster'.

  + Specify 'n' to launch nodes on the local machine.
  + Specify 'url' for receiving connections from remote nodes.
  + Optionally, specify 'remote' to launch remote daemons using a remote configuration generated by `remote_config()` or `ssh_config()`.

Created clusters may be used for any function in the `parallel` base package such as `parallel::clusterApply()` or `parallel::parLapply()`, or the load-balanced versions such as `parallel::parLapplyLB()`.

``` r
library(parallel)
library(mirai)

cl <- makeCluster(6, type = "MIRAI")
cl
#> < miraiCluster | ID: `0` nodes: 6 active: TRUE >
parLapply(cl, iris, mean)
#> $Sepal.Length
#> [1] 5.843333
#> 
#> $Sepal.Width
#> [1] 3.057333
#> 
#> $Petal.Length
#> [1] 3.758
#> 
#> $Petal.Width
#> [1] 1.199333
#> 
#> $Species
#> [1] NA
```

`status()` may be called on a 'miraiCluster` to query the number of connected nodes at any time.

``` r
status(cl)
#> $connections
#> [1] 6
#> 
#> $daemons
#> [1] "ipc:///tmp/468d15baad12987297924d3a"
stopCluster(cl)
```

Making a cluster specifying 'url' without 'remote' causes the shell commands for manual deployment of nodes to be printed to the console.

``` r
cl <- make_cluster(n = 2, url = host_url())
#> Shell commands for deployment on nodes:
#> 
#> [1]
#> Rscript -e 'mirai::daemon("tcp://192.168.2.179:49947",dispatcher=FALSE,cleanup=FALSE,rs=c(10407,1353351353,-1043629786,-29560465,-1602291484,-248192363,-1183841710))'
#> 
#> [2]
#> Rscript -e 'mirai::daemon("tcp://192.168.2.179:49947",dispatcher=FALSE,cleanup=FALSE,rs=c(10407,-440398556,800923107,1329159622,2121404046,1811662990,825393618))'
stop_cluster(cl)
```

[&laquo; Back to ToC](#table-of-contents)

### Foreach Support

A 'miraiCluster' may also be registered by [`doParallel`](https://cran.r-project.org/package=doParallel) for use with the [`foreach`](https://cran.r-project.org/package=foreach) package.

Running some parallel examples for the `foreach()` function:


``` r
library(doParallel)
#> Loading required package: foreach
#> Loading required package: iterators
library(foreach)

cl <- makeCluster(6, type = "MIRAI")
registerDoParallel(cl)

# normalize the rows of a matrix
m <- matrix(rnorm(9), 3, 3)
foreach(i = 1:nrow(m), .combine = rbind) %dopar%
  (m[i, ] / mean(m[i, ]))
#>                [,1]        [,2]      [,3]
#> result.1   1.101225   0.4266552  1.472120
#> result.2  -1.268963   1.0011693  3.267793
#> result.3 -10.306468 -20.4872993 33.793767

# simple parallel matrix multiply
a <- matrix(1:16, 4, 4)
b <- t(a)
foreach(b = iterators::iter(b, by='col'), .combine = cbind) %dopar%
  (a %*% b)
#>      [,1] [,2] [,3] [,4]
#> [1,]  276  304  332  360
#> [2,]  304  336  368  400
#> [3,]  332  368  404  440
#> [4,]  360  400  440  480

stopCluster(cl)
```

[&laquo; Back to ToC](#table-of-contents)