当使用as.formula、SE dplyr和lapply时,foreach包如何作用于R环境?

当使用as.formula、SE dplyr和lapply时,foreach包如何作用于R环境?,r,dplyr,parallel-foreach,snow,nse,R,Dplyr,Parallel Foreach,Snow,Nse,我有一个函数,可以动态地将多个公式构建为字符串,并将它们转换为带有as.formula的公式。然后,我使用doSNOW和foreach在并行过程中调用该函数,并通过dplyr::mutate\uu使用这些公式 当我使用lappy(formula\u list,as.formula)时,并行运行时会出现错误找不到函数*自定义函数*,尽管在本地运行时效果很好。但是,当我使用lappy(formula_list,函数(x)作为.formula(x)时,它可以并行工作,也可以本地工作 为什么?了解这里的

我有一个函数,可以动态地将多个公式构建为字符串,并将它们转换为带有
as.formula
的公式。然后,我使用
doSNOW
foreach
在并行过程中调用该函数,并通过
dplyr::mutate\uu
使用这些公式

当我使用
lappy(formula\u list,as.formula)
时,并行运行时会出现错误
找不到函数*自定义函数*
,尽管在本地运行时效果很好。但是,当我使用
lappy(formula_list,函数(x)作为.formula(x)
时,它可以并行工作,也可以本地工作

为什么?了解这里的环境的正确方法是什么,以及编写环境代码的“正确”方法是什么

我确实收到了一条警告:
在e$fun(obj,substitute(ex),parent.frame(),e$data)中:已经在导出变量:*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)   
#包
图书馆(dplyr)
图书馆(双平行)
图书馆(doSNOW)
图书馆(foreach)
#一个简单的自定义函数

custom_sum我没有确切的答案来解释原因,但是包(我是作者)处理这些类型的“棘手”全局变量-它们很棘手,因为它们不是包的一部分,并且是嵌套的,即一个全局变量调用另一个全局变量。例如,如果您使用:

library("doFuture")
cl <- parallel::makeCluster(1, outfile = "")
plan(cluster, workers = cl)
registerDoFuture()
library(“doFuture”)

cl这看起来非常有帮助!我肯定会对此进行更多的调查,尽管我会把这个问题留待讨论,以便我能更好地理解核心问题。