【问题标题】:Foreach with %dopar% is not able to detect user defined function inside a user defined function具有 %dopar% 的 Foreach 无法在用户定义的函数中检测到用户定义的函数
【发布时间】:2019-11-14 08:03:20
【问题描述】:

我在 R 中使用 %dopar% 运行 foreach 循环。我创建了两个用户定义的函数。我在另一个用户定义的函数中调用一个用户定义的函数,比如 X,比如 Y。foreach 无法检测到函数 X,如果我创建包含函数 Y 的列表 L 并从 L 调用函数 Y。

我尝试过使用 .export。如果我不使用包含函数 X 的函数 Y 的函数列表,我的函数可以顺利运行。

最小的工作代码如下:

# Define the function
Fun1=function(x){
  a=2*x
  b=3*x
  c=a+b
  return(c)
}
Fun2=function(x){
  a=x
  b=Fun1(x)
  c=a+b
  return(c)
}

# Create a list containing function Fun1 and Fun2
Funlist=list(Fun1, Fun2)

# Create a variable
x=1

# Run Normal Loop
for(i in 1:10){
  a=Funlist[[1]](x)
}
### Output: a=6

# Run the foreach loop
library("foreach")
library("parallel")
library("doParallel")
library("DoE.base")

registerDoParallel(7)

## Scenario 1: Run foreach loop with Fun2
df_c=foreach(seed = 1:10, .combine=rbind)%dopar%{a=Fun2(x)}
### Output: No error

## Scenario 2: Run foreach loop with Fun1 from Funlist
df_c=foreach(seed = 1:10, .combine=rbind)%dopar%{a=Funlist[[1]](x)}
### Output: No error

## Scenario 3: Run foreach loop with Fun2 from Funlist
df_c=foreach(seed = 1:10, .combine=rbind)%dopar%{a=Funlist[[2]](x)}
### Output: Error in { : task 1 failed - "could not find function "Fun1""

我希望 df_c 给我数据帧时输出不会出错。

【问题讨论】:

  • 在您的最后一个代码中,foreach 足够聪明,可以看出它需要导出Fun2,但并不是说它还需要在Fun2 中导出Fun1,以便您需要导出它自己。
  • Funlist=c("Fun1", "Fun2") 应该是Funlist=list(Fun1, Fun2) 吗?因为否则我也无法让您的非并行代码运行。我不确定您是要存储函数的名称还是函数本身。
  • @MrFlick 是的,我同意。我试图创建函数列表。所以,Funlist=list(Fun1, Fun2) 是我使用的。感谢您指出。我已经编辑了我的评论。
  • @F.Privé 好的。您能否建议如何导出该函数,因为.export=c("Fun1") 不适合我。

标签: r function loops foreach


【解决方案1】:

代表

# Define the functions
Fun1 <- function(x) 2 * x
Fun2 <- function(x) Fun1(x + 1)

# Create a list containing functions Fun1 and Fun2
Funlist <- list(Fun1, Fun2)

# Run the foreach loop
library(doParallel)
registerDoParallel(cl <- makeCluster(2))

## Scenario 1: Run foreach loop with Fun2 
## Output: No error
foreach(x = 1:10) %dopar% Fun2(x)

## Scenario 2: Run foreach loop with Fun1 from Funlist 
## Output: No error
foreach(x = 1:10) %dopar% Funlist[[1]](x)

## Scenario 3: Run foreach loop with Fun2 from Funlist
## Output: Error in { : task 1 failed - "could not find function "Fun1""
foreach(x = 1:10) %dopar% Funlist[[2]](x)

解决方案

我首选的解决方案:永远不要依赖全局对象,始终将对象作为函数的参数传递。

Fun3 <- function(x, Fun) Fun(x + 1)
Funlist2 <- list(Fun1, Fun3)
foreach(x = 1:10) %dopar% Funlist2[[2]](x, Funlist2[[1]])

stopCluster(cl)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    相关资源
    最近更新 更多