Экспорт вручную пропущенных глобальных объектов с будущим - PullRequest
0 голосов
/ 23 мая 2019

Я определил функцию f в пакете, который принимает данные и выражение R в качестве входных данных, а затем применяет пользовательское выражение к данным. Вот пример использования функции:

f <- function(data, expr) {
  expr <- substitute(expr)
  eval(expr, envir = data)
}

data <- data.frame(a = 1:2, b = 3:4)
f(data, mean(a))
#> [1] 1.5

Проблема возникает с параллельной версией этой функции, использующей явное будущее и определенный пользователем объект. Вот версия игрушки:

library(future)

f <- function(data, expr) {
  expr <- substitute(expr)
  y <- future::future(eval(expr, envir = data))
  future::value(y)
}

data  <- data.frame(a = 1:2, b = 3:4)
myfun <- function(x){sum(sqrt(x))}

plan(sequential)
f(data, myfun(a))
#> [1] 2.414214

plan(multiprocess)
f(data, myfun(a))
#> Error in myfun(a) : impossible to find function "myfun"

Проблема в том, что myfun не может быть просто найден с помощью future и, следовательно, должен быть экспортирован вручную. Я могу решить эту проблему, проанализировав expr с помощью future::getGlobalsAndPackages, а затем вручную добавив объекты:

future::future(..., globals = structure(TRUE, add = globals))

Мне интересно, есть ли лучший / хороший способ сделать это, так как это выглядит для меня хаком.

1 Ответ

0 голосов
/ 25 мая 2019

Наконец я обнаружил, что многоточие в plan распространяется на future

 plan(multiprocess, globals = myfun)
...