如何在foreach并行循环中向periodogram函数传递列名参数
并行调用zeitgebr::periodogram时的变量传递问题
在普通for循环中可通过get(vari)传递字符串列名给zeitgebr::periodogram的var参数,但改用foreach+doParallel并行计算时,即使通过.export导出存储列名的变量vari,仍会触发以下错误:
原错误信息:
Error in { : task 1 failed - "object 'vari' not found"
中文翻译:{ : 任务1执行失败 - "找不到对象'vari'"
可行的普通for循环写法
# 无警告正常运行 y <- NULL for (i in segm_chunks) { result <- periodogram(var=get(vari), data=data_test, FUN = get(fun)) result[, "segm" := i] y <- rbind(y, result) }
报错的并行写法(变量传递列名)
x <- NULL x <- foreach(i=first(segm_chunks):last(segm_chunks), .packages=c("data.table", "zeitgebr"), .export=c("vari"), .combine=rbind) %dopar% { print(i) result <- periodogram(get(vari), data_test, FUN = get(fun)) result[, "segm" := i] }
解决方法
并行子进程无法直接访问主环境的变量,必须显式导出所有依赖项,同时可优化参数传递方式:
导出所有依赖变量:
将vari、data_test、fun全部加入.export列表,确保子进程能获取到所有需要的变量:x <- NULL x <- foreach(i=first(segm_chunks):last(segm_chunks), .packages=c("data.table", "zeitgebr"), .export=c("vari", "data_test", "fun"), .combine=rbind) %dopar% { print(i) result <- periodogram(var = get(vari), data = data_test, FUN = get(fun)) result[, "segm" := i] }直接传递列名字符串(推荐):
若zeitgebr::periodogram的var参数支持直接传入字符串列名(可查阅官方文档确认),可去掉get()调用,简化写法同时减少环境依赖:x <- NULL x <- foreach(i=first(segm_chunks):last(segm_chunks), .packages=c("data.table", "zeitgebr"), .export=c("vari", "data_test", "fun"), .combine=rbind) %dopar% { print(i) result <- periodogram(var = vari, data = data_test, FUN = get(fun)) result[, "segm" := i] }
内容的提问来源于stack exchange,提问作者Beres
相关产品推荐
相关产品推荐

