如何将R函数特定报错替换为「尝试其他种子范围」指引?
解决R函数abc的
Error in order(res2$seed): argument 1 is not a vector报错问题 问题场景
- 调用参数
abc(a = 280000, z = 281000, n = 10, p = 1, d = 0, q = 0, ar11 = 0.8, sd = 1, j1 = 4, arr1 = "0.80")时触发报错:Error in order(res2$seed): argument 1 is not a vector - 更换种子范围(如
a = 289800, z = 289989)后可正常返回预期数据框
错误根源
当指定的种子范围内没有符合筛选条件的结果时,res1会变成空列表。后续通过Reduce合并空列表会生成无seed列的空对象,调用order(res2$seed)时因找不到有效向量触发报错。
修改后的函数代码
abc <- function(a, z, n, ar11, p, d, q, sd = sd, j1, arr1, n_cores){ future::plan(future::multisession) n_cores <- parallel::detectCores() cl <- parallel::makeCluster(n_cores) doParallel::registerDoParallel(cores = n_cores) message('processing...') `%dopar%` <- foreach::`%dopar%` res <- foreach::foreach(i = a:z, .packages = c('foreach', 'forecast')) %dopar% { set.seed(i) mod <- stats::arima.sim(n = n, model = list(ar = c(ar11), order = c(p, d, q)), sd = sd) best.mod <- forecast::auto.arima(mod, ic = "aicc") cf <- best.mod$coef if (length(cf) == 0) { rep(NA, 2) } else if (all(grepl(c("ar1|intercept"), names(cf))) & substr(cf["ar1"], 1, j1) %in% arr1) { c(cf, seed = i) } else { rep(NA, 2) } } message(' done!\n') res1 <- res[!sapply(res, anyNA)] parallel::stopCluster(cl) options(max.print = .Machine$integer.max) # 新增空结果判断与错误捕获 if (length(res1) == 0) { message("请尝试其他种子范围") return(tibble::tibble()) } res2 <- Reduce(function(...) merge(..., all = T), lapply(res1, function(x) as.data.frame(t(x)))) # 用tryCatch捕获排序报错 tryCatch({ res2[order(res2$seed), ] }, error = function(e) { if (grepl("argument 1 is not a vector", e$message)) { message("请尝试其他种子范围") } return(res2) }) }
修改说明
- 前置空结果判断:先检查
res1是否为空,直接提示用户更换种子范围并返回空数据框,避免后续无效运算 - 排序阶段错误捕获:用
tryCatch包裹排序逻辑,精准匹配目标报错信息并输出指引 - 冗余代码清理:移除原函数中重复的
res2赋值语句,优化代码结构
内容的提问来源于stack exchange,提问作者Daniel James
相关产品推荐
相关产品推荐

