我有一个函数,我可以动态地将多个公式构建为字符串,并将它们转换为具有as.formula
的公式。然后,我使用doSNOW
和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,但我的意思是使用标准评估。哎呦。我已经相应地改变了这一点。
答案 0 :(得分:1)
我没有确切答案为什么在这里,但future包(我是作者)处理这些类型的“棘手”全局 - 它们很棘手,因为它们不是包的一部分它们是嵌套的,即一个全局称为另一个全局。例如,如果您使用:
library("doFuture")
cl <- parallel::makeCluster(1, outfile = "")
plan(cluster, workers = cl)
registerDoFuture()
有问题的“Call Regular Version FAILS”案例现在应该有效。
现在,上面使用parallel::makeCluster()
默认为type = "PSOCK"
,而如果您加载doSNOW,则会snow::makeCluster()
默认为type = "MPI"
。不幸的是,未来的一揽子计划已满MPI backend is yet not implemented。因此,如果您正在寻找MPI解决方案,这对您(还)无济于事。