Environment/scoping 在 furrr 中:在 future_map() 中嵌套 get()

Environment/scoping in furrr: nesting get() in future_map()

我有兴趣了解更多关于 furrr 如何从全球环境中找到东西的信息,并一般询问它的 性能。这是我不理解的行为的具体示例,可以使用一些帮助:在 future_map 调用或 get 对 return 的调用中,我需要更改什么"C""F"?

# load furrr, describe "plan"
library(furrr)
nc<-2
plan(strategy = multiprocess, workers = nc)

# create objects

a<-list("A", "B", "C")
b<-list("D", "E", "F")


#works fine
future_map(1:5, function(foo){
    map(c("a", "b"), function(my_object_name){
        bar<-my_object_name
        print(bar)

    })
})


# object 'a' not found

future_map(1:5, function(foo){
        map(c("a", "b"), function(my_object_name){
            bar<-get(my_object_name)[[3]]
            print(bar)
    })
})

编辑

似乎这个问题在所有系统上都无法重现,可能与我安装 furrr. 有关,尽管软件包给出了关于多核计划的警告,但这是 multiprocess 的问题和 multisession 但不是 plan(strategy=multicore,....

造成问题的是envir。将 envir 指定为全局环境以查找该对象和 print

library(furrr)
future_map(1:5, function(foo){
    map(c("a", "b"), function(my_object_name){
        bar <- get(my_object_name, envir = .GlobalEnv)[[3]]
        print(bar)
    })
 })
#[1] "C"
#[1] "F"
#[1] "C"
#[1] "F"
#[1] "C"
#[1] "F"
#[1] "C"
#[1] "F"
#[1] "C"
#[1] "F"
#[[1]]
#[[1]][[1]]
#[1] "C"

#[[1]][[2]]
#[1] "F"
#...

我想我在 future 包中遇到了一些已知的奇怪行为,并记录了解决方法。参见 vignette in future documentation

要将变量添加到导出的全局变量,请使用 future 中的 globals 参数,它将 furrr 转换为 , .options = future_options(globals(structure=T, add="missing_object"

我怀疑这可能也是我的问题之一:

...The above error occurs because, contrary to the master R process, the R worker that evaluated the future expression does not have data.table loaded. Instead the evaluation falls back to the [.data.frame method, which is not what we want.

Until the future framework manages to identify data.table as a required package (which is the goal), we can guide future by specifying additional packages needed...