Окружение / область видимости в furrr: вложение get () в future_map () - PullRequest
0 голосов
/ 21 марта 2020

Мне интересно узнать больше о том, как furrr находит что-то из глобальной среды, и вообще спрашивал о чёрных магах c, которые он выполняет. Вот конкретный c пример поведения, которое я не понимал и мог бы использовать некоторую помощь в: 1007 *?

# 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,....

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Я думаю, что столкнулся с некоторым странным поведением с пакетом future с документированными обходными путями. См. виньетка в будущей документации .

Чтобы добавить переменные в экспортируемые глобальные переменные, используйте аргумент globals в future, который переводится в furrr в , .options = future_options(globals(structure=T, add="missing_object"

Я подозреваю, что это также может быть одной из моих проблем:

... Вышеупомянутая ошибка возникает потому, что, в отличие от основного процесса R, работник R, который вычислил выражение future не загружен data.table. Вместо этого оценка возвращается к методу [.data.frame, а это не то, что нам нужно.

Пока будущей инфраструктуре не удастся идентифицировать data.table как необходимый пакет (что является целью), мы можем руководить будущим, указав дополнительные пакеты, необходимые ...

0 голосов
/ 21 марта 2020

Это 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"
#...
...