Я определил функцию 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))
Мне интересно, есть ли лучший / хороший способ сделать это, так как это выглядит для меня хаком.