首页 > 解决方案 > 当一些文件包含错误时并行处理运行多个文件

问题描述

我希望R使用并行处理运行文件夹中的每个文件。一些R文件包含故意错误。一旦遇到第一个错误,这些错误似乎会导致并行处理停止。有没有办法R继续运行文件夹中的所有文件,为每个不包含错误的文件返回结果?

这是R尝试运行文件夹中七个文件中的每一个的代码。七个文件中的三个包含错误并且不应运行,但我想获得四个不包含错误的文件的结果。并行处理代码只返回两个文件的结果,而不是四个文件。

setwd('C:/Users/mark_/Documents/simple R programs/')

library(parallel)

detectCores()
#[1] 12

#make a cluster
my.cluster <- makeCluster(3)

folderName <- 'run_all_these3'
files <- list.files(folderName, full.names=TRUE)

parSapply(my.cluster, files, source)

stopCluster(my.cluster)

这是文件夹中的七个文件run_all_these3。这些文件的不同之处仅在于seed输出CSV文件的名称以及其中三个文件包含summsum. CSV仅返回四个不包含错误的文件中的两个的输出文件。

RWindows 10笔记本电脑上运行。

文件:run1.R

set.seed(1234)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- sum(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum1.csv', row.names=FALSE, quote=FALSE)

文件:run2.R

set.seed(4444)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- sum(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum2.csv', row.names=FALSE, quote=FALSE)

文件:run3.R

set.seed(4321)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- summ(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum3.csv', row.names=FALSE, quote=FALSE)

文件:run4.R

set.seed(1111)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- sum(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum4.csv', row.names=FALSE, quote=FALSE)

文件:run5.R

set.seed(2222)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- summ(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum5.csv', row.names=FALSE, quote=FALSE)

文件:run6.R

set.seed(2121)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- summ(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum6.csv', row.names=FALSE, quote=FALSE)

文件:run7.R

set.seed(3434)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- sum(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum7.csv', row.names=FALSE, quote=FALSE)

标签: rparallel-processing

解决方案


您可以使用它foreach来控制如何处理错误。

library(doParallel)
registerDoParallel(my.cluster <- makeCluster(3))
files <- c("doesnotexist.R")
foreach(file = files, .errorhandling = "remove") %dopar% {
  source(file)
}
stopCluster(my.cluster)

您可以使用.combine组合结果(c,cbind等),否则默认返回列表。


推荐阅读