我正在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给我数据帧,输出不会有错误。
答案 0 :(得分:0)
SSL certificate problem: unable to get local issuer certificate
我的首选解决方案:从不依赖于全局对象,而始终将对象作为函数的参数传递。
# 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)