我希望使用并行处理来运行文件夹中的每个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
文件的名称以及三个文件包含summ
作为sum
的不正确指定。仅针对不包含错误的四个文件中的两个返回输出CSV
文件。
我正在R
笔记本电脑上运行Windows 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)
答案 0 :(得分:2)
您可以使用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
等),否则默认情况下它将返回一个列表。
答案 1 :(得分:1)
您可以使用try(source(file, ...))
或tryCatch(source(file, ...), error = function(e) NULL)
(出现错误时返回NULL
),例如
parSapply(my.cluster, files, function(file, ...) try(source(file, ...)))
或
parSapply(my.cluster, files, function(file, ...) {
tryCatch(source(file, ...), error = function(e) NULL)
})