(window.webpackJsonp=window.webpackJsonp||[]).push([[2924],{3333:function(t,a,s){"use strict";s.r(a);var e=s(31),n=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"parallel-processing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parallel-processing"}},[t._v("#")]),t._v(" Parallel processing")]),t._v(" "),s("h2",{attrs:{id:"parallel-processing-with-parallel-package"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parallel-processing-with-parallel-package"}},[t._v("#")]),t._v(" Parallel processing with parallel package")]),t._v(" "),s("p",[t._v("The base package "),s("code",[t._v("parallel")]),t._v(" allows parallel computation through forking, sockets, and random-number generation.")]),t._v(" "),s("p",[t._v("Detect the number of cores present on the localhost:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("parallel"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("detectCores"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("all.tests "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("FALSE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" logical "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("TRUE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("Create a cluster of the cores on the localhost:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("parallelCluster "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" parallel"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("makeCluster"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("parallel"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("detectCores"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("First, a function appropriate for parallelization must be created. Consider the "),s("code",[t._v("mtcars")]),t._v(" dataset. A regression on "),s("code",[t._v("mpg")]),t._v(" could be improved by creating a separate regression model for each level of "),s("code",[t._v("cyl")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("data "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" mtcars\nyfactor "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'cyl'")]),t._v("\nzlevels "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" sort"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("unique"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("yfactor"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ndatay "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\ndataz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\ndatax "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n\n\nfitmodel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dataz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n glm.fit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("dataz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("dataz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),s("p",[t._v("Create a function that can loop through all the possible iterations of "),s("code",[t._v("zlevels")]),t._v(". This is still in serial, but is an important step as it determines the exact process that will be parallelized.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("fitmodel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dataz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n glm.fit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("dataz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("dataz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("zlevel "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" zlevels"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n print"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"*****"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n print"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n print"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fitmodel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dataz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),s("p",[t._v("Curry this function:")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("worker "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n fitmodel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dataz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),s("p",[t._v("Parallel computing using "),s("code",[t._v("parallel")]),t._v(" cannot access the global environment. Luckily, each function creates a local environment "),s("code",[t._v("parallel")]),t._v(" can access. Creation of a wrapper function allows for parallelization. The function to be applied also needs to be placed within the environment.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("wrapper "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dataz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# force evaluation of all paramters not supplied by parallelization apply")]),t._v("\n force"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n force"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n force"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dataz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# these variables are now in an enviroment accessible by parallel function")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# function to be applied also in the environment")]),t._v("\n fitmodel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dataz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n glm.fit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("dataz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" y "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("dataz "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# calling in this environment iterating over single parameter zlevel")]),t._v("\n worker "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n fitmodel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("zlevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dataz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n return"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("worker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),s("p",[t._v("Now create a cluster and run the wrapper function.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("parallelcluster "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" parallel"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("makeCluster"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("parallel"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("detectCores"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nmodels "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" parallel"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("parLapply"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("parallelcluster"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("zlevels"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n wrapper"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("datax"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" datay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dataz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("Always stop the cluster when finished.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("parallel"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),t._v("stopCluster"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("parallelcluster"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("The "),s("code",[t._v("parallel")]),t._v(" package includes the entire "),s("code",[t._v("apply()")]),t._v(" family, prefixed with "),s("code",[t._v("par")]),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"parallel-processing-with-foreach-package"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#parallel-processing-with-foreach-package"}},[t._v("#")]),t._v(" Parallel processing with foreach package")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("foreach")]),t._v(" package brings the power of parallel processing to R. But before you want to use multi core CPUs you have to assign a multi core cluster. The "),s("code",[t._v("doSNOW")]),t._v(" package is one possibility.")]),t._v(" "),s("p",[t._v("A simple use of the foreach loop is to calculate the sum of the square root and the square of all numbers from 1 to 100000.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("library"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("foreach"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nlibrary"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("doSNOW"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\ncl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" makeCluster"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" type "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SOCK"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nregisterDoSNOW"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nf "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" foreach"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("100000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" .combine "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" c"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" .inorder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" F"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token percent-operator operator"}},[t._v("%dopar%")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n k "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" sqrt"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n k\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n\n")])])]),s("p",[t._v("The structure of the output of "),s("code",[t._v("foreach")]),t._v(" is controlled by the "),s("code",[t._v(".combine")]),t._v(" argument. The default output structure is a list. In the code above, "),s("code",[t._v("c")]),t._v(" is used to return a vector instead. Note that a calculation function (or operator) such as "),s("code",[t._v('"+"')]),t._v(" may also be used to perform a calculation and return a further processed object.")]),t._v(" "),s("p",[t._v("It is important to mention that the result of each foreach-loop is the last call. Thus, in this example "),s("code",[t._v("k")]),t._v(" will be added to the result.")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[s("strong",[t._v("Parameter")])]),t._v(" "),s("th",[t._v("Details")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v(".combine")]),t._v(" "),s("td",[t._v("combine Function. Determines how the results of the loop are combined. Possible values are "),s("code",[t._v("c")]),t._v(", "),s("code",[t._v("cbind")]),t._v(", "),s("code",[t._v("rbind")]),t._v(", "),s("code",[t._v('"+"')]),t._v(", "),s("code",[t._v('"*"')]),t._v("...")])]),t._v(" "),s("tr",[s("td",[t._v(".inorder")]),t._v(" "),s("td",[t._v("if "),s("code",[t._v("TRUE")]),t._v(" the result is ordered according to the order of the iteration vairable (here "),s("code",[t._v("i")]),t._v("). If "),s("code",[t._v("FALSE")]),t._v(" the result is not ordered. This can have postive effects on computation time.")])]),t._v(" "),s("tr",[s("td",[t._v(".packages")]),t._v(" "),s("td",[t._v("for functions which are provided by any package except "),s("code",[t._v("base")]),t._v(", like e.g. "),s("code",[t._v("mass")]),t._v(", "),s("code",[t._v("randomForest")]),t._v(" or else, you have to provide these packages with "),s("code",[t._v('c("mass", "randomForest")')])])])])]),t._v(" "),s("h2",{attrs:{id:"random-number-generation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#random-number-generation"}},[t._v("#")]),t._v(" Random Number Generation")]),t._v(" "),s("p",[t._v("A major problem with parallelization is the used of RNG as seeds. Random numbers by the number are iterated by the number of operations from either the start of the session or the most recent "),s("code",[t._v("set.seed()")]),t._v(". Since parallel processes arise from the same function, it can use the same seed, possibly causing identical results! Calls will run in serial on the different cores, provide no advantage.")]),t._v(" "),s("p",[t._v("A set of seeds must be generated and sent to each parallel process. This is automatically done in some packages ("),s("code",[t._v("parallel")]),t._v(", "),s("code",[t._v("snow")]),t._v(", etc.), but must be explicitly addressed in others.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("s "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" seed\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v("numofcores"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n s "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" nextRNGStream"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# send s to worker i as .Random.seed")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),s("p",[t._v("Seeds can be also be set for reproducibility.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("clusterSetRNGStream"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("cl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" parallelcluster"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" iseed"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("h2",{attrs:{id:"mcparalleldo"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#mcparalleldo"}},[t._v("#")]),t._v(" mcparallelDo")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("mcparallelDo")]),t._v(" package allows for the evaluation of R code asynchronously on Unix-alike (e.g. Linux and MacOSX) operating systems. The underlying philosophy of the package is aligned with the needs of exploratory data analysis rather than coding. For coding asynchrony, consider the "),s("a",{attrs:{href:"https://cran.r-project.org/package=future",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("future")]),s("OutboundLink")],1),t._v(" package.")]),t._v(" "),s("h3",{attrs:{id:"example"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example"}},[t._v("#")]),t._v(" Example")]),t._v(" "),s("p",[t._v("Create data")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ToothGrowth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("Trigger mcparallelDo to perform analysis on a fork")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("mcparallelDo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("glm"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("len "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("~")]),t._v(" supp "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" dose"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("ToothGrowth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"interactionPredictorModel"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("Do other things, e.g.")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("binaryPredictorModel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" glm"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("len "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("~")]),t._v(" supp"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("ToothGrowth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\ngaussianPredictorModel "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<-")]),t._v(" glm"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("len "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("~")]),t._v(" dose"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("ToothGrowth"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("p",[t._v("The result from mcparallelDo returns in your targetEnvironment, e.g. .GlobalEnv, when it is complete with a message (by default)")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[t._v("summary"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("interactionPredictorModel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n")])])]),s("h3",{attrs:{id:"other-examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-examples"}},[t._v("#")]),t._v(" Other Examples")]),t._v(" "),s("div",{staticClass:"language-r extra-class"},[s("pre",{pre:!0,attrs:{class:"language-r"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Example of not returning a value until we return to the top level")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n mcparallelDo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" targetValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exists"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" print"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Example of getting a value without returning to the top level")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n mcparallelDo"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" targetValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n mcparallelDoCheck"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("exists"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"output"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" print"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("i"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),s("h4",{attrs:{id:"remarks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#remarks"}},[t._v("#")]),t._v(" Remarks")]),t._v(" "),s("p",[t._v("Parallelization on remote machines require libraries to be downloaded on each machine. Prefer "),s("code",[t._v("package::function()")]),t._v(" calls. Several packages have parallelization natively built-in, including "),s("code",[t._v("caret")]),t._v(", "),s("code",[t._v("pls")]),t._v(" and "),s("code",[t._v("plyr")]),t._v(".")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://mran.revolutionanalytics.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Microsoft R Open"),s("OutboundLink")],1),t._v(" (Revolution R) also uses multi-threaded BLAS/LAPACK libraries which intrinsically parallelizes many common functions.")])])}),[],!1,null,null,null);a.default=n.exports}}]);