【问题标题】:Environment/scoping in furrr: nesting get() in future_map()furrr 中的环境/范围:在 future_map() 中嵌套 get()
【发布时间】:2020-07-02 14:55:21
【问题描述】:

我有兴趣了解更多关于furrr 如何从全球环境中查找内容的信息,并普遍询问了black magic 它的表现。这是我不理解的行为的一个具体示例,可以使用一些帮助:我需要在future_map 调用或get 调用中更改什么以返回"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. 有关plan(strategy=multicore,....

【问题讨论】:

    标签: r scoping furrr


    【解决方案1】:

    造成问题的是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"
    #...
    

    【讨论】:

    • 我试过没有成功。 &gt; future_map(1:5, function(foo){ + map(c("a", "b"), function(my_object_name){ + bar&lt;-get(my_object_name, envir=.GlobalEnv)[[3]] + print(bar) + }) + })Error in get(my_object_name, envir = .GlobalEnv) : object 'a' not found
    • @Michael 我假设您在全局环境中创建了a&lt;-list("A", "B", "C"); b&lt;-list("D", "E", "F")(如您的帖子所示)
    • @Michael 请检查您的ls() 是否有对象“a”、“b”,以防您在未创建对象的新 R 会话中执行此操作
    • 我相信我有:ls() [1] "a" "b" "nc"
    • @Michael 我也有那个对象ls()# [1] "a" "b" , ...
    【解决方案2】:

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

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

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

    ...出现上述错误是因为,与主R进程相反, 评估 future 表达式的 R 工作人员没有 data.table 已加载。相反,评估会退回到 [.data.frame 方法,这不是我们想要的。

    直到未来的框架设法将data.table 识别为 所需的包(这是目标),我们可以通过 指定所需的其他软件包...

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      相关资源
      最近更新 更多