176176# ' , verbose = 1
177177# ' )
178178# ' }
179- # ' @importFrom data.table data.table setDT setcolorder := as.data.table copy .I setnames is.data.table
179+ # ' @importFrom data.table data.table setDT setcolorder := as.data.table copy .I setnames is.data.table rbindlist
180180# ' @importFrom utils head tail
181181# ' @export
182182bayesOpt <- function (
@@ -271,7 +271,7 @@ bayesOpt <- function(
271271 scoreSummary <- foreach(
272272 iter = 1 : nrow(initGrid )
273273 , .options.multicore = list (preschedule = FALSE )
274- , .combine = rbind
274+ , .combine = list
275275 , .multicombine = TRUE
276276 , .inorder = FALSE
277277 , .errorhandling = ' pass'
@@ -280,18 +280,45 @@ bayesOpt <- function(
280280 ) %op % {
281281
282282 Params <- initGrid [get(" iter" ),]
283- Elapsed <- system.time(Result <- do.call(what = FUN , args = as.list(Params )))
284- if (! any(names(Result ) == " Score" )) stop(" FUN must return list with element 'Score' at a minimum." )
283+ Elapsed <- system.time(
284+ Result <- tryCatch(
285+ {
286+ do.call(what = FUN , args = as.list(Params ))
287+ }
288+ , error = function (e ) e
289+ )
290+ )
291+
292+ # Make sure everything was returned in the correct format. Any errors here will be passed.
293+ if (any(class(Result ) %in% c(" simpleError" ," error" ," condition" ))) return (Result )
294+ if (class(Result ) != " list" ) stop(" Object returned from FUN was not a list." )
295+ resLengths <- lengths(Result )
296+ if (! any(names(Result ) == " Score" )) stop(" FUN must return list with element 'Score' at a minimum." )
297+ if (! is.numeric(Result $ Score )) stop(" Score returned from FUN was not numeric." )
298+ if (any(resLengths != 1 )) {
299+ badReturns <- names(Result )[which(resLengths != 1 )]
300+ stop(" FUN returned these elements with length > 1: " ,paste(badReturns ,collapse = " ," ))
301+ }
302+
285303 data.table(Params ,Elapsed = Elapsed [[3 ]],as.data.table(Result ))
286304
287305 }
288306 )[[3 ]]
289307 while (sink.number() > 0 ) sink()
290308 if (verbose > 0 ) cat(" " ,tm ," seconds\n " )
291309
292- # foreach passes errors as a vector.
293- if (! is.data.table(scoreSummary )) {
294- stop(paste0(" FUN failed to run on initial try. First error returned was <<" ,scoreSummary [[1 ]]," >>" ))
310+ # Scan our list for any simpleErrors. If any exist, stop the process and return the errors.
311+ se <- which(sapply(scoreSummary ,function (cl ) any(class(cl ) %in% c(" simpleError" ," error" ," condition" ))))
312+ if (length(se ) > 0 ) {
313+ print(
314+ data.table(
315+ initGrid [se ,]
316+ , errorMessage = sapply(scoreSummary [se ],function (x ) x $ message )
317+ )
318+ )
319+ stop(" Errors encountered in initialization are listed above." )
320+ } else {
321+ scoreSummary <- rbindlist(scoreSummary )
295322 }
296323
297324 # Format scoreSummary table. Initial iteration is set to 0
0 commit comments