1

複数の数式を文字列として動的に作成し、それらを で数式にキャストする関数がありますas.formuladoSNOW次に、 とを使用して並列プロセスでその関数を呼び出し、 でforeachこれらの式を使用しdplyr::mutate_ます。

使用すると、ローカルで実行すると正常に動作しますが、並列で実行するとlapply(formula_list, as.formula)エラーが発生します。could not find function *custom_function*ただし、使用するlapply(formula_list, function(x) as.formula(x)と、並行してローカルで動作します。

なんで?ここで環境を理解する正しい方法と、それをコーディングする「正しい」方法は何ですか?

次のような警告が表示されます。In e$fun(obj, substitute(ex), parent.frame(), e$data) : already exporting variable(s): *custom_func*

最小限の再現可能な例を以下に示します。

# Packages
library(dplyr)
library(doParallel)
library(doSNOW)
library(foreach)

# A simple custom function
  custom_sum <- function(x){
    sum(x)
  } 

# Functions that call create formulas and use them with nse dplyr:
  dplyr_mut_lapply_reg <- function(df){
    my_dots <- setNames(
      object = lapply(list("~custom_sum(Sepal.Length)"), as.formula),
      nm     = c("Sums")
    )

    return(
      df %>%
      group_by(Species) %>%
      mutate_(.dots = my_dots)
    )
  }

  dplyr_mut_lapply_lambda <- function(df){
    my_dots <- setNames(
      object = lapply(list("~custom_sum(Sepal.Length)"), function(x) as.formula(x)),
      nm     = c("Sums")
   )

    return(
      df %>%
      group_by(Species) %>%
      mutate_(.dots = my_dots)
   )
 }

#1. CALLING BOTH LOCALLY
dplyr_mut_lapply_lambda(iris) #works
dplyr_mut_lapply_reg(iris) #works

#2. CALLING IN PARALLEL
  #Faux Parallel Setup
  cl <- makeCluster(1, outfile="")
  registerDoSNOW(cl)

  # Call Lambda Version WORKS
  foreach(j = 1,
          .packages = c("dplyr", "tidyr"),
          .export   = lsf.str()
          ) %dopar% {
     dplyr_mut_lapply_lambda(iris) 
  }



  # Call Regular Version FAILS
  foreach(j = 1,
          .packages = c("dplyr", "tidyr"),
          .export   = lsf.str()
          ) %dopar% {
     dplyr_mut_lapply_reg(iris) 
  }

  # Close Cluster
  stopCluster(cl)   

編集: 元の投稿のタイトルで、nse を使用していると書きましたが、本当は標準評価を使用するつもりでした。おっと。それに応じてこれを変更しました。

4

1 に答える 1