并行化 for 循环时出错

Errors when parallelizing for loop

我是并行处理的新手,并尝试并行化一个 for 循环,在该循环中,我通过将所述数据框中的列与其他两个数据框匹配来在数据框中创建新列。 j,我试图在其中创建列的数据框是 400000 x 54。a 和 c,我匹配 j 的两个数据框分别是 5000 x 12 和 45000 x 8(分别)。

下面是我尝试并行化之前的初始循环:

for(i in 1:nrow(j)) {
   if(j$Inspection_Completed[i] == TRUE) {
      next
  }

  j$Assigned_ID <- a$Driver[match(j$car_name, a$CarName)]

  j$Title <- c$Title[match(j$Site_ID, c$LocationID)]

  j$Status <- c$Status[match(j$Site_ID, c$LocationID)]    
 

}

到目前为止,我尝试了以下操作:

cl <- snow::makeCluster(4)
doSNOW::registerDoSNOW(cl)

foreach::foreach(i = 1:nrow(j)) foreach::`%dopar%` {
   if(j$Inspection_Completed[i] == TRUE) {
      next
   }

  j$Assigned_ID <- a$Driver[match(j$car_name, a$CarName)]

  j$Title <- c$Title[match(j$Site_ID, c$LocationID)]

  j$Status <- c$Status[match(j$Site_ID, c$LocationID)] 
} 
stopCluster(cl)

但是,当我 运行 上面的代码时,我收到了几个错误。

Error: unexpected symbol in "foreach::foreach(i = 1:nrow(j)) foreach"

并且:

Error: object 'i' not found

最后:

Error: unexpected '}' in "}"

我不确定为什么会收到这些错误。 None 任何数据框中的列都是因素,我无法发现任何不匹配的括号或方括号。我也在没有 snow 和 doSNOW 包的情况下完成了这个,结果是一样的。我已经 运行 它没有围绕多巴的刻度线以及相同的结果。

(我以前不知道这个。)

R 不喜欢带有 :: 符号的中缀运算符。即使您这样做是为了命名空间管理,R 也没有:

1L %in% 1:2
# [1] TRUE
1L base::%in% 1:2
# Error: unexpected symbol in "1L base"
1L base::`%in%` 1:2
# Error: unexpected symbol in "1L base"

解决方法:

  1. 重新定义你自己的中缀,只是模仿另一个中缀,如

    `%myin%` <- base::`%in%`
    1L %myin% 1:2
    # [1] TRUE
    
  2. 在代码中的那个点之前使用 library(foreach) 的显式命名空间包含,并且只使用 %dopar%。 (并不是说它有多大帮助,但使用 library(foreach) 并不意味着你不能使用 foreach::foreach,尽管这是不必要的。)