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

Мне интересно узнать больше о том, как furrrнаходит вещи из глобальной среды и обычно спрашивает о черной магии, которую он выполняет. Вот конкретный пример поведения, которое я не понимал и мог бы использовать некоторую помощь: Что мне нужно изменить в любом из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. Несмотря на предупреждение пакета о многоядерных планах, это проблема с multiprocess а также multisession но нет plan(strategy=multicore,....

2 ответа

Решение

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

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

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

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

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

Это 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"
#...
Другие вопросы по тегам