Foreach 循环仅针对第一组工作人员返回错误消息

Posted

技术标签:

【中文标题】Foreach 循环仅针对第一组工作人员返回错误消息【英文标题】:Foreach loop returns an error message for first set of workers only 【发布时间】:2021-05-02 23:25:23 【问题描述】:

在我一直在处理的一个包中开始发生一些非常奇怪的事情。我正在使用带有 doparallel 后端的 foreach 循环来执行重复的随机游走,并在邻接矩阵上重新启动(下面的可重现示例)。

install.packages("Matrix")
install.packages("foreach")
devtools::install_github("https://github.com/DavisWeaver/crosstalkr")
library(foreach)
m <- replicate(1000, sample(x = c(0,1), size = 1000, replace = TRUE))
w <- Matrix::Matrix(m, sparse = TRUE)
w <- Matrix::t(Matrix::t(w)/Matrix::colSums(w)) #normalize based on the column sum.
seeds <- sample(1:nrow(w), size = 32)

每次迭代都应该执行一次随机游走并重新开始,并返回一个亲和度分数的数字向量(因此矩阵输入,一维向量输出)。我尝试在每次迭代中通过更简单的任务重现此错误,但我无法做到。此设置适用于 matrix::colSums(w) 和其他一些琐碎的任务。

为第一组工作人员中的每一个返回以下错误:“”。每次后续迭代都完全按预期执行,没有错误。所以当你运行下面的第一个 foreach 循环时,你会得到the following image.

当您使用相同的并行后端运行后续 foreach 循环时,每次迭代都会按预期执行,there are no error messages!

cl <- parallel::makeCluster(4)
doParallel::registerDoParallel(cl)

n = 8
null_dist <-
  foreach::foreach(i = 1:n, .errorhandling = 'pass') %dopar% 
    crosstalkr::sparseRWR(w, seed_proteins = seeds, norm = FALSE)[[1]]
  

null_dist <-
  foreach::foreach(i = 1:n, .errorhandling = 'pass') %dopar% 
    crosstalkr::sparseRWR(w, seed_proteins = seeds, norm = FALSE)[[1]]
  


parallel::stopCluster(cl)

我不知道从这里去哪里...我猜这与我如何设置并行后端有关?任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

我不确定为什么会发生这种情况。但是,要解决此问题,您需要将.packages = "Matrix" 显式添加到foreach

如果不指定.packagesnrow 不会产生正确的结果。

这是一个简化的例子

library(foreach)

w <- Matrix::Matrix()

您可以看到前四个值是错误的NULL

cl <- parallel::makeCluster(4)
doParallel::registerDoParallel(cl)

null_dist <- foreach::foreach(i = seq_len(6)) %dopar% 
  nrow(w)


parallel::stopCluster(cl)

null_dist
#> [[1]]
#> NULL
#> 
#> [[2]]
#> NULL
#> 
#> [[3]]
#> NULL
#> 
#> [[4]]
#> NULL
#> 
#> [[5]]
#> [1] 1
#> 
#> [[6]]
#> [1] 1

添加.packages = "Matrix" 可以解决这个问题。

cl <- parallel::makeCluster(4)
doParallel::registerDoParallel(cl)

null_dist <- foreach::foreach(i = seq_len(6), .packages = "Matrix") %dopar% 
  nrow(w)


parallel::stopCluster(cl)

null_dist
#> [[1]]
#> [1] 1
#> 
#> [[2]]
#> [1] 1
#> 
#> [[3]]
#> [1] 1
#> 
#> [[4]]
#> [1] 1
#> 
#> [[5]]
#> [1] 1
#> 
#> [[6]]
#> [1] 1

【讨论】:

以上是关于Foreach 循环仅针对第一组工作人员返回错误消息的主要内容,如果未能解决你的问题,请参考以下文章

在 foreach 循环中调用存储过程 - 仅第一次执行

bash中通过关联数组的foreach循环仅返回最后一个元素

foreach 循环仅输出数组中的最后一个元素

如何限制 ForEach 在 SwiftUI 中显示一组项目?

返回所有带有 ACF 字段和 foreach 循环的数组值

PHP和Java中foreach循环的用法区别