RStudio后台任务中future包multisession无法识别ncores参数
RStudio后台任务中future::multisession找不到ncores参数的问题解决
问题描述
我希望使用future包及其配套的future.apply包执行并行运算,在交互式RStudio会话中运行代码正常:
library(future) ncores = 10 # 定义工作进程数 plan(future::multisession(workers = ncores)) print("Done") #> [1] "Done"
由reprex包(v2.0.1)于2023-01-19生成
但通过RStudio「后台任务」标签页运行时,future::multisession()无法找到环境中的ncores参数,报错信息如下:
Error in tweak.future(function (..., workers = availableCores(), lazy = FALSE, : object 'ncores' not found Calls: sourceWithProgress ... eval -> plan -> do.call -> <Anonymous> -> tweak.future Execution halted
我尝试指定environment()作为环境,打印当前环境对象可见ncores,但仍报错:
library(future) ncores = 10 print(ls(environment())) # 定义工作进程数 plan(future::multisession(workers = ncores, envir = environment())) print("Done")

会话信息
sessionInfo() #> R version 4.1.2 (2021-11-01) #> Platform: x86_64-apple-darwin17.0 (64-bit) #> Running under: macOS Big Sur 10.16 #> #> Matrix products: default #> BLAS: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRblas.0.dylib #> LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib #> #> locale: #> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 #> #> attached base packages: #> [1] stats graphics grDevices utils datasets methods base #> #> loaded via a namespace (and not attached): #> [1] digest_0.6.29 withr_2.5.0 magrittr_2.0.3 reprex_2.0.1 #> [5] evaluate_0.15 highr_0.9 stringi_1.7.6 rlang_1.0.6 #> [9] cli_3.6.0 rstudioapi_0.13 fs_1.5.2 rmarkdown_2.13 #> [13] tools_4.1.2 stringr_1.4.0 glue_1.6.2 xfun_0.31 #> [17] yaml_2.3.5 fastmap_1.1.0 compiler_4.1.2 htmltools_0.5.2 #> [21] knitr_1.39
由reprex包(v2.0.1)于2023-01-27生成
解决方法
方法1:直接传入数值而非变量
RStudio后台任务的执行环境与交互式会话存在差异,变量传递易出现查找问题。直接指定workers参数为数值即可规避:
library(future) # 直接指定工作进程数 plan(future::multisession(workers = 10)) print("Done")
方法2:绑定变量到全局环境
若需通过变量控制核心数,可将变量存入全局环境,确保后台任务能读取到:
library(future) # 将变量绑定到全局环境 assign("ncores", 10, envir = .GlobalEnv) # 从全局环境读取变量 plan(future::multisession(workers = get("ncores", envir = .GlobalEnv))) print("Done")
方法3:封装为函数并显式传参
把并行逻辑封装成函数,通过函数参数传递核心数,完全避免环境变量查找问题:
library(future) run_parallel <- function(cores) { plan(future::multisession(workers = cores)) # 在此添加你的并行运算逻辑 print("Done") } # 调用函数时传入核心数 run_parallel(10)
方法4:更新future包到最新版本
部分旧版本的future包在非交互式环境下存在环境传递bug,更新到最新版本可修复此类问题:
install.packages("future") library(future)
内容的提问来源于stack exchange,提问作者Francesco Grossetti
相关产品推荐
相关产品推荐

