gpt4 book ai didi

r - doParallel "foreach"不一致地从父环境 : "Error in { : task 1 failed - "could not find function. 继承对象..”

转载 作者:行者123 更新时间:2023-12-01 22:56:48 25 4
gpt4 key购买 nike

我在使用 foreach 时遇到了一个问题,我无法弄清楚。以下代码在我尝试过的两台 Windows 计算机上失败,但在三台 Linux 计算机上成功,所有计算机都运行相同版本的 R 和 doParallel:

library("doParallel")
registerDoParallel(cl=2,cores=2)

f <- function(){return(10)}
g <- function(){
r = foreach(x = 1:4) %dopar% {
return(x + f())
}
return(r)
}
g()

在这两台 Windows 计算机上,返回以下错误:

Error in { : task 1 failed - "could not find function "f""

但是,这在 Linux 计算机上工作得很好,并且使用 %do% 而不是 %dopar% 也工作得很好,并且对于常规 for 循环也工作得很好。

变量也是如此,例如设置i <- 10并替换 return(x + f())return(x + i)

对于遇到同样问题的其他人,有两种解决方法:

1)使用.export显式导入所需的函数和变量:

r = foreach(x=1:4, .export="f") %dopar% 

2)导入所有全局对象:

r = foreach(x=1:4, .export=ls(.GlobalEnv)) %dopar% 

这些解决方法的问题在于,对于大型、积极开发的软件包来说,它们并不是最稳定的。无论如何,foreach 的行为应该与 for 类似。

有什么想法导致此问题以及是否有解决办法吗?

<小时/>

该功能运行的计算机版本信息:

R version 3.2.2 (2015-08-14)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS release 6.5 (Final)

other attached packages:
[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3

该功能无法运行的计算机:

R version 3.2.2 (2015-08-14)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

other attached packages:
[1] doParallel_1.0.10 iterators_1.0.8 foreach_1.4.3

最佳答案

@Tensibai 是对的。当尝试在 Windows 上使用 doParallel 时,您必须“导出”您想要使用的不在当前范围内的函数。根据我的经验,我完成这项工作的方式是使用以下(经过编辑的)示例。

format_number <- function(data) {
# do stuff that requires stringr
}

format_date_time <- function(data) {
# do stuff that requires stringr
}

add_direction_data <- function(data) {
# do stuff that requires dplyr
}

parse_data <- function(data) {
voice_start <- # vector of values
voice_end <- # vector of values
target_phone_numbers <- # vector of values
parse_voice_block <- function(block_start, block_end, number) {
# do stuff
}

number_of_cores <- parallel::detectCores() - 1
clusters <- parallel::makeCluster(number_of_cores)
doParallel::registerDoParallel(clusters)
data_list <- foreach(i = 1:length(voice_start), .combine=list,
.multicombine=TRUE,
.export = c("format_number", "format_date_time", "add_direction_data"),
.packages = c("dplyr", "stringr")) %dopar%
parse_voice_block(voice_start[i], voice_end[i], target_phone_numbers[i])
doParallel::stopCluster(clusters)
output <- plyr::rbind.fill(data_list)
}

由于前三个函数不包含在我当前的环境中,doParallel 在启动 R 的新实例时会忽略它们,但它会知道在哪里找到 parse_voice_block code> 因为它在当前范围内。此外,您需要指定应在每个新的 R 实例中加载哪些包。正如 Tensibai 所说,这是因为您没有运行 fork 进程,而是启动多个 R 实例并同时运行命令。

关于r - doParallel "foreach"不一致地从父环境 : "Error in { : task 1 failed - "could not find function. 继承对象..”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34653567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com