for文の並列処理への書換について

1.まずはfor文でいったん処理を書き下す

  for (i in 引数) {

          (処理)

  }

 

2.for文のiterationを引数に持つ関数に書き換える

  関数 <- function(i = 引数) {

    (処理)

  }

 

3.future_mapに2の関数を埋め込む

  future::plan(future::multisession)

  furrr::future_map_AA(

          .x = 引数,

          .f = ~ 関数(i = .x),

    .options = furrr::furrr_options(seed  = 1L)

  )

  future::plan(future::sequential)

 

_AAの部分は欲しいデータ出力型に合わせて変更。例えば、並列化した出力結果をbind_rowsで結合した状態がお望みなら、future_map_dfrとすればよい。

 

注意点としては、ときおりfuture_map内にlibraryがマウントされないことがあるっぽい。。for文のときはうまくいった処理が、future_mapにしたとたん処理が進まなくなるのは、このパターンが多い印象。

 

そのときは

・しっかりエラー文を読む

・future_map内の処理をいったん区切って処理不可の原因を切り分ける

・future_map内でlibraryを明示的に読み込む(pacman::p_load()とか)

あたりをすれば大体解決した。

 

3つ目のエラーとよく関連するエラー文

Error in UseMethod("predict") : 
   'predict' をクラス "c('glmnet')" のオブジェクトに適用できるようなメソッドがありません 

こんなエラーがでたら、関数のなかでpacman::p_load('glmnet')でOK

 

 

libraryが競合するときにエラーが多い気がする。

`conflicted::conflict_prefer_all(winner = 'dplyr')`

などでlibrary間の順位関係を決めてしまえばよさそう。