Окружение / область видимости в 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"
#...