R语言parSapply并行调用自定义函数识别失败报错问题问询
parSapply 报错排查与解决方案
报错原因
parSapply的第三个参数要求传入函数对象,你代码中填写的dummy_function(2,5)是直接执行函数得到的数值结果,不符合参数要求,因此触发类型错误。- 你传入的迭代参数
1:1000没有被自定义函数接收使用,你的需求本质是和replicate效果一致,重复运行1000次固定参数的dummy_function(2,5)。
解决方案
有两种常用的修正方式,可根据你的实际需求选择:
方式1:匿名函数包裹(适配不需要用到迭代值的重复运行场景)
直接把报错的代码行:
results <- parSapply(cl, 1:1000, dummy_function(2,5))
替换为:
results <- parSapply(cl, 1:1000, function(i) dummy_function(2,5))
匿名函数的入参i会承接1:1000传入的每个迭代值,你不需要用到的话可以直接忽略即可。
方式2:参数透传(适配需要把迭代值作为函数参数的场景)
如果后续你需要把迭代值作为参数传入自定义函数,比如让x参数随迭代值变化、y固定为5,可以调整为:
results <- parSapply(cl, 1:1000, dummy_function, y=5)
parSapply会自动把迭代值作为第一个参数传入dummy_function,额外的固定参数可以直接放在函数名后面传入。
完整可运行代码
library(parallel) dummy_function <- function(x,y){ x_ <- runif(1000, 0, x) y_ <- runif(1000, 0, y) return(median(x_*y_)) } # 串行验证运行正常 replicate(10, dummy_function(2,5)) cl <- makeCluster(detectCores()-1) # 若未使用MASS包相关功能,可删除下一行 clusterEvalQ(cl,library(MASS)) clusterSetRNGStream(cl) clusterExport(cl, c("dummy_function")) # 修正后的并行调用 results <- parSapply(cl, 1:1000, function(i) dummy_function(2,5)) stopCluster(cl) # 输出前6条结果验证 head(results)
内容的提问来源于stack exchange,提问作者Josep Pueyo
相关产品推荐
相关产品推荐

