gpt4 book ai didi

r - 如何初始化工作人员以并行使用包函数

转载 作者:行者123 更新时间:2023-12-04 13:55:21 24 4
gpt4 key购买 nike

我正在开发一个 R 包并尝试在其中使用并行处理来解决一个令人尴尬的并行问题。我想编写一个循环或函数来使用我包中的其他函数。我在 Windows 上工作,我尝试过使用 parallel::parLapplyforeach::%dopar% ,但无法让工作人员(核心)访问我的包中的功能。
这是一个包含两个函数的简单包的示例,其中第二个函数使用 %dopar% 在并行循环中调用第一个函数。 :

add10 <- function(x) x + 10

slowadd <- function(m) {
cl <- parallel::makeCluster(parallel::detectCores() - 1)
doParallel::registerDoParallel(cl)

`%dopar%` <- foreach::`%dopar%` # so %dopar% doesn't need to be attached

foreach::foreach(i = 1:m) %dopar% {
Sys.sleep(1)
add10(i)
}

stopCluster(cl)
}
当我用 devtools::load_all() 加载包时并调用 slowadd功能, Error in { : task 1 failed - "could not find function "add10""被退回。
我还尝试使用我的包显式初始化工作人员:
add10 <- function(x) x + 10

slowadd <- function(m) {
cl <- parallel::makeCluster(parallel::detectCores() - 1)
doParallel::registerDoParallel(cl)

`%dopar%` <- foreach::`%dopar%` # so %dopar% doesn't need to be attached

foreach::foreach(i = 1:m, .packages = 'mypackage') %dopar% {
Sys.sleep(1)
add10(i)
}

stopCluster(cl)
}
但我收到错误 Error in e$fun(obj, substitute(ex), parent.frame(), e$data) : worker initialization failed: there is no package called 'mypackage' .
如何让工作人员访问我的包中的功能?使用 foreach 的解决方案会很棒,但我对使用 parLapply 的解决方案完全开放或其他功能/包。

最佳答案

由于人们的有用评论,我能够使用我的包的功能初始化工作人员。通过确保所有需要的包函数都导出到 NAMESPACE 中,并使用 devtools::install() 安装我的包。 , foreach能够找到用于初始化的包。该示例的 R 脚本如下所示:

#' @export
add10 <- function(x) x + 10

#' @export
slowadd <- function(m) {
cl <- parallel::makeCluster(parallel::detectCores() - 1)
doParallel::registerDoParallel(cl)

`%dopar%` <- foreach::`%dopar%` # so %dopar% doesn't need to be attached

out <- foreach::foreach(i = 1:m, .packages = 'mypackage') %dopar% {
Sys.sleep(1)
add10(i)
}

stopCluster(cl)
return(out)
}
这是有效的,但它不是一个理想的解决方案。首先,它使工作流程变慢。我正在使用 devtools::load_all()每次我对包进行更改并想对其进行测试时(在合并并行性之前),但现在我每次都必须重新安装包,当包很大时这很慢。其次,并行循环中需要的每个函数都需要导出,以便 foreach可以找到。我的实际用例有很多我宁愿保留在内部的小型实用程序功能。

关于r - 如何初始化工作人员以并行使用包函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63526526/

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