R Shiny中使用foreach替代双层for循环运行报错如何解决
问题原因
- 变量名笔误:你在
%dopar%内部将calc()的返回结果赋值给了val,但构造输出数据框时调用的是tmp$mean_b、tmp$mean_c,tmp变量未定义。单独运行时不报错是全局环境残留了之前生成的tmp变量,属于环境污染导致的假象。 - 并行环境变量传递缺失:
doMC创建的子进程无法自动获取shiny响应式环境中的input对象、全局定义的calc()函数、df数据框,因此在shiny场景下运行会提示对象不存在。
修正方案
按以下规则修改data响应式函数即可:
- 把
tmp替换为正确的变量名val - 提前将
input$selected_let提取为普通局部变量,避免子进程直接访问shiny的input对象 - 在
foreach中添加.export参数,显式将子进程需要用到的calc函数、df数据框导出到并行环境
修正后的完整代码如下:
data <- reactive({ # 提前提取响应式输入为普通局部变量 selected_let <- input$selected_let foreach( i = rep(seq(0, 1, by = 0.1), each = 11), j = rep(seq(0, 1, by = 0.1), times = 11), .combine = "rbind", # 显式导出并行计算需要的函数和全局数据 .export = c("calc", "df") ) %dopar% { val <- calc(let = selected_let, var1 = i, var2 = j) data.frame( var1 = i, var2 = j, mean_b = val$mean_b, mean_c = val$mean_c ) } })
如果后续calc函数迭代中用到了其他自定义函数或全局数据,将其补充到.export的字符向量中即可。
内容的提问来源于stack exchange,提问作者Justas Mundeikis
相关产品推荐
相关产品推荐

