futureverse / future

:rocket: R package: future: Unified Parallel and Distributed Processing in R for Everyone
https://future.futureverse.org
954 stars 85 forks source link

`future` unable to export libraries of list encapsulated functions #741

Open gowerc opened 1 month ago

gowerc commented 1 month ago

Describe the bug

If a function is wrapped in a list then future seems to be unable to detect the libraries used by that function:

library(lubridate)
library(future)
my_a_fun <- function(x) {
    zz <- days(3)
    x
}
callme <- function(fun) {
    obj <- list(funny = fun)
    wrapper <- function(x) {
        obj$funny(x)
    }
    future::future(wrapper(1))
}

plan(multisession, workers = 2)
value(callme(my_a_fun))

Error in days(3) : could not find function "days"

Expected behavior

That it would be able to recognise that the lubridate library is required

Session information

Please share your session information after the error has occurred so that we also see which packages and versions are involved;

> sessionInfo()
R version 4.4.1 (2024-06-14)
Platform: x86_64-apple-darwin23.4.0
Running under: macOS Sonoma 14.6.1

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
LAPACK: /usr/local/Cellar/r/4.4.1/lib/R/lib/libRlapack.dylib;  LAPACK version 3.12.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Europe/London
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] lubridate_1.9.3 future_1.34.0  

loaded via a namespace (and not attached):
 [1] compiler_4.4.1    parallelly_1.38.0 generics_0.1.3    parallel_4.4.1    tools_4.4.1       rstudioapi_0.16.0 listenv_0.9.1     codetools_0.2-20 
 [9] digest_0.6.37     globals_0.16.3    timechange_0.3.0

> future::futureSessionInfo()
*** Package versions
future 1.34.0, parallelly 1.38.0, parallel 4.4.1, globals 0.16.3, listenv 0.9.1

*** Allocations
availableCores():
system 
    12 
availableWorkers():
$system
 [1] "localhost" "localhost" "localhost" "localhost" "localhost" "localhost" "localhost" "localhost" "localhost" "localhost" "localhost" "localhost"

*** Settings
- future.plan=<not set>
- future.fork.multithreading.enable=<not set>
- future.globals.maxSize=<not set>
- future.globals.onReference=<not set>
- future.resolve.recursive=<not set>
- future.rng.onMisuse=<not set>
- future.wait.timeout=<not set>
- future.wait.interval=<not set>
- future.wait.alpha=<not set>
- future.startup.script=<not set>

*** Backends
Number of workers: 2
List of future strategies:
1. multisession:
   - args: function (..., workers = 2, envir = parent.frame())
   - tweaked: TRUE
   - call: plan(multisession, workers = 2)

*** Basic tests
Main R session details:
    pid     r sysname release                                                                                           version nodename machine
1 65511 4.4.1  Darwin  23.6.0 Darwin Kernel Version 23.6.0: Mon Jul 29 21:13:00 PDT 2024; root:xnu-10063.141.2~1/RELEASE_X86_64  host001  x86_64
    login    user effective_user
1 user001 user001        user001
Worker R session details:
  worker   pid     r sysname release                                                                                           version nodename
1      1 65631 4.4.1  Darwin  23.6.0 Darwin Kernel Version 23.6.0: Mon Jul 29 21:13:00 PDT 2024; root:xnu-10063.141.2~1/RELEASE_X86_64  host001
2      2 65632 4.4.1  Darwin  23.6.0 Darwin Kernel Version 23.6.0: Mon Jul 29 21:13:00 PDT 2024; root:xnu-10063.141.2~1/RELEASE_X86_64  host001
  machine   login    user effective_user
1  x86_64 user001 user001        user001
2  x86_64 user001 user001        user001
Number of unique worker PIDs: 2 (as expected)